我目前正在學習java浮點數。我知道,一個浮動有一定數量的重要消息。我也知道,浮點數在java中表示爲-1或1 * num * 10^x。其中num是數字,10^x是小數點。但在這裏,我們沒有一小部分數字。這裏的無限循環如何可能?Java無限循環 - 浮點數123456789
與無限循環的代碼:
float f = 123456789;
while (f-- > 0) {
System.out.println(f);
}
我目前正在學習java浮點數。我知道,一個浮動有一定數量的重要消息。我也知道,浮點數在java中表示爲-1或1 * num * 10^x。其中num是數字,10^x是小數點。但在這裏,我們沒有一小部分數字。這裏的無限循環如何可能?Java無限循環 - 浮點數123456789
與無限循環的代碼:
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
可使程序完成,但問題會發生在更高的數字上。
你確定循環是無限的嗎? f變成0後會發生什麼? –
f保持不變並且不減少。這是一個無限循環。這是去年在大學的考試問題(例如考試)。 – thomas
f不夠精確來表示這個數字(f--)是解決方案,但爲什麼? – thomas