2017-01-01 107 views
6

我目前正在學習java浮點數。我知道,一個浮動有一定數量的重要消息。我也知道,浮點數在java中表示爲-1或1 * num * 10^x。其中num是數字,10^x是小數點。但在這裏,我們沒有一小部分數字。這裏的無限循環如何可能?Java無限循環 - 浮點數123456789

與無限循環的代碼:

float f = 123456789; 
while (f-- > 0) { 
System.out.println(f); 
} 
+1

你確定循環是無限的嗎? f變成0後會發生什麼? –

+0

f保持不變並且不減少。這是一個無限循環。這是去年在大學的考試問題(例如考試)。 – thomas

+0

f不夠精確來表示這個數字(f--)是解決方案,但爲什麼? – thomas

回答

4

這是關於浮點運算。當你減少數字時,你遇到了這種情況,當你通過數字f = 1.23456792E8使得一切都出錯,因爲f-1f在這裏具有相同的浮點表示。所以遞減會使數字成爲自身,導致無限循環。只需檢查:

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

數字有什麼特別之處,爲什麼執行在那裏停止?這是因爲123456789的浮點表示是1.23456792E8。由於缺少浮點數的精度,這已經給我們至少造成了3的差距。使用double而不是float可使程序完成,但問題會發生在更高的數字上。

+0

你做了什麼意味着破壞一切? –

+0

該算法 - 謝謝,我會改變它 –

+0

爲什麼它不是0.23456792E8? – thomas