GCC与VS2013中std::setprecision(0)的正确行为
Correct behavior for std::setprecision(0) in GCC vs VS2013
根据我使用的编译器,在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
。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- 从 VS2013 到 VS2017 std::async 不会启动新线程
- std::与VS2013相比,GCC 4.7.2中的MAP实现效率非常低
- 为什么 boost::mutex 比 std::mutex 快 vs2013.
- GCC与VS2013中std::setprecision(0)的正确行为
- VS2013-输出窗口不显示std::cout
- std::make_pair C++11+VS2013=编译器错误
- 带有成员函数的VS2013 std::函数
- 如何将std::map传递到VS2013中的可变模板?