我有這樣的代碼示例:打印浮點值
float approx = 1234567712f;
System.out.println(approx);
而不是印刷「1.234567712E9」或類似的東西它打印「1.23456768E9」。據我所知,這與二進制級別的精度有關。
浮點數的精度(逗號(「,」符號之前和之後)有多少個二進制數字?你能以簡單的方式解釋它爲什麼會發生這種情況?
我有這樣的代碼示例:打印浮點值
float approx = 1234567712f;
System.out.println(approx);
而不是印刷「1.234567712E9」或類似的東西它打印「1.23456768E9」。據我所知,這與二進制級別的精度有關。
浮點數的精度(逗號(「,」符號之前和之後)有多少個二進制數字?你能以簡單的方式解釋它爲什麼會發生這種情況?
float在逗號前後的精度最高可達7位數。這就是爲什麼1234567是正確的,其他3位數字不正確。 如果要用高數字計算,則應該使用double而不是float
浮點數包含「有效數」和「指數」。爲了表示整數直到最後一個奇數,指數必須爲零。這意味着,你必須使用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
這是你看到的數字。
http://en.wikipedia.org/wiki/Single-precision_floating-point_format – rgettman
這個問題已被問到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