0

我想了解i在這段代碼中的結尾是99999904嗎?Java float長時間顯式轉換

long i = (long)(99999900f); 
System.out.println(i); 

據我所知,花車存儲與小數和不準確的價值,他們似乎是,但我看不出這有可能導致第一個數字是4,而不是9或東西會最終達到99999900?

+2

試試'System.out.println(99999900f);' –

+0

9.9999904E7最簡短的評論,曾經有過這麼清楚的解釋過!是否所有浮動數字都以該格式存儲?即在小數點之前有1位數字?謝謝 – Randy

+0

沒關係,剛剛測試過一對,似乎隨着數字的增長,我們在小數中存儲了更多的數字,可能是因爲我們可以適合大於浮點大小的數字。再次感謝 – Randy

回答

1

我想了解如何在這段代碼最終被99999904

99999904具有二進制一個簡單的表示比99999900(使用較少的顯著位),因爲後者需要比可以存儲在浮點數中更有意義的數字,Java必須使用最接近的可表示值。

 
99999900 in hex: 0x5F5E09C 
What 24 significant binary digits look like in hex: 
       0x7FFFFF8 
99999904 in hex: 0x5F5E0A0 

兩個最接近的可表示值0x5F5E098和0x5F5E0A0之間,爪哇根據「nearest-even」規則選擇了後者。兩個可表示的值實際上相等,但0x5F5E0A0對於最後一位有效數字爲0,因此根據此規則進行選擇。你可以自己檢查99999899舍入到0x5F5E098和99999900舍入到0x5F5E0A0。

對於float類型有24個重要的二進制數字,可以精確地表示0到2之間的所有整數。 2 恰巧也可以精確地表示(它只有一個有效數字),但是不能準確地表示爲float,而且它上面的整數不能自動精確表示爲float無論是。