根据我使用的编译器,我在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.