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。

我的问题是:

  1. setprecision的正确/标准行为是什么
  2. 什么是使用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

最新更新