【发布时间】:2021-06-15 20:08:17
【问题描述】:
我一直觉得 iomanip 令人困惑且违反直觉。我需要帮助。
快速互联网搜索发现 (https://www.vedantu.com/maths/precision)“因此,我们将精度视为十进制数中小数点后有效数字的最大数量”(重点是我的)。这也符合我的理解。但是我写了一个测试程序并且:
stm << std::setprecision(3) << 5.12345678;
std::cout << "5.12345678: " << stm.str() << std::endl;
stm.str("");
stm << std::setprecision(3) << 25.12345678;
std::cout << "25.12345678: " << stm.str() << std::endl;
stm.str("");
stm << std::setprecision(3) << 5.1;
std::cout << "5.1: " << stm.str() << std::endl;
stm.str("");
输出:
5.12345678: 5.12
25.12345678: 25.1
5.1: 5.1
如果精度为 3,则输出应为:
5.12345678: 5.123
25.12345678: 25.123
5.1: 5.1
显然,C++ 标准对与浮点数相关的“精度”含义有不同的解释。
如果我这样做:
stm.setf(std::ios::fixed, std::ios::floatfield);
那么前两个值的格式正确,但最后一个输出为5.100。
如何在没有填充的情况下设置精度?
【问题讨论】:
-
很好的问题。每次我告诉我的学生关于 setprecision 的这种行为时,我一直想知道如果我需要在点之后给定的精度但没有尾随的零,我该怎么办......然后在讲座结束时我很快就忘记了这一点。希望我最终能在这个问题的答案部分找到答案。
-
小心:
5.1不能完全表示为二进制浮点数 -
@Caleth。真的吗?我认为你错了。
std::cout << "5.1: " << (double)5.1 << std::endl;精确打印“5.1:5.1”。完全没有错误。浮动也是如此。 -
@AlastairG:真的。
(double)5.1实际上是2871044762448691 * 2^-49也就是5.0999999999999996447286321199499070644378662109375这个页面很有帮助:exploringbinary.com/floating-point-converter