最少的惊喜原则

时间:2013-03-21 20:29:06

标签: java

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

这是我在“最小惊喜原则”中读到的一个例子

我只是好奇为什么代码会返回0.999999999,如果我将d的数据类型更改为float,我得到1.0000001。这种行为背后的原因是什么。

1 个答案:

答案 0 :(得分:7)

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

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