3
double d = 0.0;
    for (int i = 0; i < 10; i++)
    {
        d = d+0.1;
    }
    System.out.println(d);

This is an example I read somewhere on "Principle of Least Surprise"

I was just curious on why the code would return a 0.999999999 and if I change the datatype of d to float, i get a 1.0000001. What is the reason behind such behavior.

4

1 回答 1

7

这是浮点数不精确的典型案例。由于 0.1 不能用二进制干净地表示(它是一个重复的数字),因此随着数字一遍又一遍地添加到自身,存在舍入误差。当我们更改为浮点数时的行为差异归结为在更多位存储过程中实际保持 0.1 的方式的差异。

如果您需要真正准确地表示十进制数,BigDecimal 类将很快成为您最好的朋友。基于它如何在不损失精度的情况下在内部存储小数的细节,计算保持其完整性。

于 2013-03-21T20:32:13.210 回答