gpt4 book ai didi

c++ - GCC 与 VS2013 中 std::setprecision(0) 的正确行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:41 25 4
gpt4 key购买 nike

根据我使用的编译器,我在 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] paragraph 5, Stage 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,floatfield 的默认值未设置:

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

关于c++ - GCC 与 VS2013 中 std::setprecision(0) 的正确行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34622698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com