C++ 舍入行为

C++ rounding behavior

#include <iostream>
#include <iomanip>

int main()
{
    float f = 0.115;

    std::cout << f << std::endl;
    std::cout << std::fixed << std::setprecision(2) << f << std::endl;

    return 0;
}

以上代码的输出为:

0.115
0.12

0.115 四舍五入为 0.12 是有道理的。但是,当我们将 f 更改为 0.225 时,输出为:

0.225
0.22

为什么不四舍五入到 0.23?

您的计算机无法准确表示大多数小数,因为它使用二进制数。相反,它会尝试找到它 可以 表示的最接近的数字,并使用它来代替。

例如,我的电脑将以下数字表示为:

decimal      actual representation
0.115        0.115000002
0.225        0.224999994
0.245        0.245000005
0.335        0.335000008
0.445        0.444999993

默认情况下,C++ 将使用正常舍入到最接近的值,即数字 5-9 向上舍入,0-4 向下舍入。因此,上述数字中,0.1150.2450.335将四舍五入为0.120.240.34,而0.2250.445 将向下舍入为 0.220.44.