2013-11-22 110 views
2

我有這樣的代碼示例:打印浮點值

float approx = 1234567712f; 
System.out.println(approx); 

而不是印刷「1.234567712E9」或類似的東西它打印「1.23456768E9」。據我所知,這與二進制級別的精度有關。

浮點數的精度(逗號(「,」符號之前和之後)有多少個二進制數字?你能以簡單的方式解釋它爲什麼會發生這種情況?

+0

http://en.wikipedia.org/wiki/Single-precision_floating-point_format – rgettman

+1

這個問題已被問到100次的不同形式。它總是回到這樣一個事實,即32位浮點數的「有效位」只有23位。你不能表示一個數字比2^24中的一個部分更精確。因此在浮點上,2^24 + 1 == 2^24。和2^24〜16M。請參閱[每個計算機科學家應該瞭解的浮點數](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – Floris

回答

0

float在逗號前後的精度最高可達7位數。這就是爲什麼1234567是正確的,其他3位數字不正確。 如果要用高數字計算,則應該使用double而不是float

2

浮點數包含「有效數」和「指數」。爲了表示整數直到最後一個奇數,指數必須爲零。這意味着,你必須使用24位(第24位始終爲1,因此不存儲),並且可以存儲的最大整數是

0xFFFFFF == 16777215 

當你想添加2這個數字,「準確」代表將是

0x1000001 = 16777217 

你需要25位來存儲這個數字;所以最後一位被砍掉,這個數字將被存儲爲

0x800000 x 2^1 == 16777216 

隨着數字變大時,「跳」連續表示的數字之間變大。當你到達

1234567112 == 0x4995FFC8 

你需要32位來存儲它。但你只有24位,所以它會在內部的東西存放像

0x499600 x 2^8 (rounded to the closest number). 

= 0x49960000 = 1234567168

這是你看到的數字。