This question already has answers here:
double or float datatype doesn't addup properly in a loop?

(5个答案)


3年前关闭。




我目前是learningig Java浮点数。我知道,一个浮动对象有一定数量的重要对象。我也知道,浮点数在Java中表示为-1或1 * num * 10 ^ x。其中num是数字,10 ^ x是十进制“点”。但是在这里,我们所占的比例并不大。这里怎么可能发生无限循环?

带有无限循环的代码:
float f = 123456789;
while (f-- > 0) {
System.out.println(f);
}

最佳答案

这是关于浮点运算的。当递减数字时,遇到数字f = 1.23456792E8时会偶然发现这种情况,这会使一切都出错,因为f-1f在此处具有相同的浮点表示形式。因此,递减使数字本身,从而导致无限循环。只需检查:

System.out.println(1.23456792E8f);
System.out.println(1.23456792E8f - 1);

数字有什么特别之处,为什么执行从那里停止?这是因为123456789的浮点表示形式是1.23456792E8。由于缺乏浮点数的精度,这已经给我们至少3的间隔。使用double而不是float可以使程序完成,但是使用更高的数字会出现此问题。

08-05 05:52
查看更多