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。
我的问题是:
这是根据下面的评论更新的代码
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)
根据 22.4.2.2.2 [facet.num.put.virtuals] 第 5 段,第 1 阶段,关于精度的说法是:
对于从浮点类型的转换,if
floatfield != (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
。
归档时间: |
|
查看次数: |
1057 次 |
最近记录: |