GCC 与 VS2013 中 std::set precision(0) 的正确行为

Pay*_*man 5 c++ gcc visual-studio-2013

根据我使用的编译器,我在 n=0 时得到该函数的不同输出。

std::string ToStrWPrec(double a_value, const int n)
{
    std::ostringstream out; 
    out << std::setprecision(n) << a_value; 
    return out.str();
}
Run Code Online (Sandbox Code Playgroud)

(GCC) 4.8.3 20140911 (Red Hat 4.8.3-9) 对于 ToStrWPrec(1.2345678,0) 返回 1。对于相同的代码,VS2013 返回 1.2346。

我的问题是:

  1. set precision 的正确/标准行为是什么?
  2. 使用 set precision 的更好替代方案是什么?

这是根据下面的评论更新的代码

std::string ToStrWPrec(double a_value, const int n)
{
    std::ostringstream out; 
    out << std::setprecision(n) << std::fixed<< a_value; 
    return out.str();
}
Run Code Online (Sandbox Code Playgroud)

Die*_*ühl 2

根据 22.4.2.2.2 [facet.num.put.virtuals] 第 5 段,第 1 阶段,关于精度的说法是:

对于从浮点类型的转换,iffloatfield != (ios_base::fixed | ios_base::scientific), str.precision()被指定为转换规范中的精度。否则,不指定精度。

同一段在其他地方指定定义结果的格式说明符是%g

的默认值floatfield没有根据 27.5.5.2 [basic.ios.cons] 第 3 段表 128 设置:

flags() skipws | dec

因此,它归结为格式字符串如何"%.0g"格式化值。C 标准 7.21.6.1 第 8 段规定:

如果非零,则令P等于精度;如果省略精度,则令 P 等于精度;如果精度为零,则令 P 等于精度。

看来,正确的结果是1