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是十进制“点”。但是在这里,我们所占的比例并不大。这里怎么可能发生无限循环?
带有无限循环的代码:
数字有什么特别之处,为什么执行从那里停止?这是因为
(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-1
和f
在此处具有相同的浮点表示形式。因此,递减使数字本身,从而导致无限循环。只需检查:
System.out.println(1.23456792E8f);
System.out.println(1.23456792E8f - 1);
数字有什么特别之处,为什么执行从那里停止?这是因为
123456789
的浮点表示形式是1.23456792E8
。由于缺乏浮点数的精度,这已经给我们至少3
的间隔。使用double
而不是float
可以使程序完成,但是使用更高的数字会出现此问题。