我們開始與你的十進制數59.858139
轉換,這個數字將二進制:111011.11011011101011101111111101011100011011000001000110100001000100...
即這個數字是二進制的無限分數。不可能完全表示它。 (以同樣的方式,這是不可能的十進制數來表示1/3完全一致)
重寫次數某種形式的二進制科學計數法:
10^101 * 1.1101111011011101011101111111101011100011011000001000110100001000100...
請記住,這仍是二進制,所以10^101
對應於2^5
十進制表示法。
現在...浮點值可以在尾數中存儲23位。如果我們舍它採用「輪最近的」舍入模式,我們得到:
10^101 * 1.11011110110111010111100
等於:
111011.110110111010111100
這是所有能融入精度浮點數據類型。現在轉換回十進制:
59.8581390380859375
似乎相當接近59.858139其實......但是,這僅僅是運氣。如果我們將第二接近的浮點值轉換爲二進制值,會發生什麼?
111011.110110111010111011 = 59.858135223388671875
所以基本上分辨率約爲0.000004
。
所以我們所能從float值中真正知道的是這個數字是這樣的:59.858139
±可以是59.858137
或59.858141
。
由於最後一位數字相當不確定,我猜測打印代碼足夠聰明,可以理解最後一位數字不在浮點值的精度範圍內,因此該值四捨五入爲59.85814
。
順便說一句,如果你(像我是)都懶得用手二進制和十進制小數之間的轉換,你可以使用this converter。如果您想詳細瞭解浮點系統的詳細信息,the wikipedia page for floating point representation是一個很好的資源。
請使用IEEE754,而不是二進制數學;)此外,這裏有這個http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – Shark 2012-08-09 13:04:28
@Shark目的不是要將十進制值轉換爲浮點表示。他的計劃已經做到了。問題的關鍵在於說明數字是二進制的無限分數,因此不可能精確表示,無論使用何種精度。 – Alderath 2012-08-09 13:14:44