根据我使用的编译器,在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阶段,这是关于精度的:
对于浮点类型的转换,如果在转换规范中将
floatfield != (ios_base::fixed | ios_base::scientific), str.precision()
指定为精度。否则,不指定精度。
同一段落在其他地方指定了定义结果的格式说明符为%g
。
floatfield
的默认值不根据27.5.5.2[basic.ios.cons]第3段表128:设置
flags()
skipws | dec
因此,它可以归结为"%.0g"
的格式字符串如何格式化值。7.21.6.1第8段中的C标准规定:
如果非零,设p等于精度;如果省略精度,设6;如果精度为零,设1。
看来,正确的结果是1
。