c – 在GCC与VS2013中纠正std :: setprecision(0)的行为

根据我使用的编译器,我在n = 0时得到一个不同的输出.

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

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

我的问题是:

> setprecision的正确/标准行为是什么?
>使用setprecision有什么好的替代方案?

这是基于以下评论的更新代码

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

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

For conversion from a floating-point type, if floatfield != (ios_base::fixed | ios_base::scientific), str.precision() is specified as precision in the conversion specification. Otherwise, no precision is specified.

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

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

flags() skipws | dec

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

Let P equal the precision if nonzero, 6 if the precision is omitted, or 1 if the precision is zero.

看来,正确的结果是1.

点赞