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 :(得分:7)
这是浮点数不精确的经典案例。由于0.1不能以二进制形式干净地表示(它是一个重复的数字),因此随着数字被反复添加到自身中,存在舍入误差。当我们改变浮动时,行为的差异恰好归结为在更多存储位的过程中实际保持0.1的差异。
如果您需要十分精确的十进制数表示,BigDecimal类将很快成为您最好的朋友。基于它如何在内部存储小数的细节而不会损失精度,计算可以保持其完整性。