This question already has answers here:
java double precision [duplicate]

(2个答案)


7年前关闭。



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。这种行为背后的原因是什么?

最佳答案

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

如果您需要真正准确地表示十进制数字,则BigDecimal类将很快成为您最好的 friend 。根据它如何在内部存储小数位数的细节而又不损失精度,计算可保持其完整性。

09-26 12:22