循环的Java无限 - 浮动123456789

Cha*_*lie 6 java infinite-loop while-loop

我目前正在学习java浮点数.我知道,浮动具有特定数量的显着差异.我也知道,浮点数在java中表示为-1或1*num*10 ^ x.其中num是数字,10 ^ x是小数"点".但在这里,我们没有一小部分.这里的无限循环怎么可能?

无限循环的代码:

float f = 123456789;
while (f-- > 0) {
System.out.println(f);
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*ski 4

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

System.out.println(1.23456792E8f);
System.out.println(1.23456792E8f - 1);
Run Code Online (Sandbox Code Playgroud)

这个数字有什么特别之处以及为什么执行会在那里停止?这是因为 的浮点表示形式1234567891.23456792E83由于浮点数缺乏精度,这已经给我们带来了至少 的差距。使用double而不是float使程序完成,但数字更大时会出现问题。