在C+中以5结尾的浮点数方面,不同的舍入结果+; 今天早上我在寻找C++中的浮点数方法,我发现了我的问题。
然而,我注意到一些不寻常的事情。当我尝试将某些浮点数四舍五入到小数点后两位时,像1.075和1.895这样的数字似乎遵循不同的四舍五入规则。具体来说,使用以下简单代码:在C+中以5结尾的浮点数方面,不同的舍入结果+; 今天早上我在寻找C++中的浮点数方法,我发现了我的问题。,c++,rounding,C++,Rounding,然而,我注意到一些不寻常的事情。当我尝试将某些浮点数四舍五入到小数点后两位时,像1.075和1.895这样的数字似乎遵循不同的四舍五入规则。具体来说,使用以下简单代码: #include <iostream> #include <iomanip> int main(int argc, char** argv) { float testme[] = { 1.07500, 1.89500, 2.70500, 3.47500}; std::cout <&
#include <iostream>
#include <iomanip>
int main(int argc, char** argv)
{
float testme[] = { 1.07500, 1.89500, 2.70500, 3.47500};
std::cout << std::setprecision(2) << std::fixed;
for(int i = 0; i < 4; ++i)
{
std::cout << testme[i] << std::endl;
}
return 0;
}
因此,1.075变为1.08,而1.895变为1.89。这真把我弄糊涂了。我希望你能解释一下。谢谢 我认为这是一个浮点数无法精确表示数字1.895的问题。计算机可以存储的最接近1.895的浮点值实际上是
1.894999980926513671875
如果四舍五入到小数点后两位,实际上应该是1.89,因为在查看下一个数字后,您会向下四舍五入
我设法用这个方法得到了上面的数字,这可能对解释其他值也很有用。大多数十进制数字不能用二进制格式精确表示,所以它们必须四舍五入。IEEE 754定义了该程序的几种可能性,我想您可以看到这一种(引用自): 四舍五入到最近值,与偶数关联–四舍五入到最近值;如果数字中途下降,则使用偶数(零)最低有效位四舍五入到最接近的值;这是二进制浮点的默认值,也是十进制的推荐默认值
基本上,以数字5结尾的十进制数字有时向上舍入,有时向下舍入,以避免统计漂移。打印更多字符,更好地了解1.075和1.895是如何表示的:这些数字可能无法用二进制精确表示,因此您永远不会有这些数字。因此,舍入会受到相应的影响。您没有对数字进行舍入。std::setprecision(2)不舍入任何内容。如果要对数字进行四舍五入,则应使用type
double
而不是float
和std::round
或类似方法。密切相关:遗憾的是,将大小增加到double
还不够好:而且数字更多:
1.894999980926513671875