This question already has answers here:
java double precision [duplicate]
(2个答案)
7年前关闭。
这是我在“最不惊奇的原理”上读到的一个例子
我只是好奇为什么代码会返回0.999999999,如果我将d的数据类型更改为float,则会得到1.0000001。这种行为背后的原因是什么?
(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