Java - 带有浮点数的无限while循环[重复]
Posted
技术标签:
【中文标题】Java - 带有浮点数的无限while循环[重复]【英文标题】:Java - infinite while loop with float [duplicate] 【发布时间】:2017-05-15 20:15:47 【问题描述】:我目前正在学习 java 浮点数。我知道,浮点数具有特定数量的重要数字。我也知道,浮点数在 java 中表示为 -1 或 1 * num * 10^x。其中 num 是数字,10^x 是小数点“点”。但是这里我们没有数字的一小部分。这里怎么可能出现无限循环?
无限循环的代码:
float f = 123456789;
while (f-- > 0)
System.out.println(f);
【问题讨论】:
你确定循环是无限的吗? f 变为 0 后会发生什么? f 保持不变并且没有递减。这是一个无限循环。这是去年大学的一道考试题(示例考试)。 f 不够精确,无法表示这个数字 (f--) 是解决方案,但为什么呢? 查看***.com/questions/31903174/… 【参考方案1】:这是关于浮点运算的。当您递减数字时,您偶然发现f = 1.23456792E8
的情况会使一切出错,因为f-1
和f
在这里具有相同的浮点表示。所以递减使数字成为它自己,这导致了无限循环。只需检查:
System.out.println(1.23456792E8f);
System.out.println(1.23456792E8f - 1);
这个数字有什么特别之处,为什么执行会停在那里?这是因为123456789
的浮点表示是1.23456792E8
。由于浮点数缺乏精度,这已经给我们带来了至少3
的差距。使用double
而不是float
可以完成程序,但如果数字越大,问题就会出现。
【讨论】:
毁灭一切是什么意思? 算法——谢谢,我会改的 为什么不是 0.23456792E8? 如果你的意思是 1.23456789E8 - 据我所知,这个数字没有浮点表示,所以它必须是最接近它的。我会把这个添加到答案中。 啊谢谢。但是 f-- 会减少一些东西,但不会在相关区域?以上是关于Java - 带有浮点数的无限while循环[重复]的主要内容,如果未能解决你的问题,请参考以下文章