2012-01-31 94 views
2

將值27.8675309輸入到IEEE 754 Converter的「十進制表示」字段中,將我輸入的值更改爲27.86753。同樣,Java在解析具有相同值的字符串時會丟棄最後兩位數字。爲什麼我的浮動被截斷?

Float.parseFloat("27.8675309") // Results in a float value of 27.86753 

我不知道是什麼IEEE轉換器的「十進制表示」實際上是(它是一個浮動?),但我希望它給我最大的數字可能是:

  1. 是一個浮點值
  2. 不超過我進入
  3. 原值

我希望Java來以類似的方式表現,就是我希望的上述代碼行返回一個浮點值等於27.8675308或者更接近我原始輸入的浮點值,而不是隻刪除小數位。我在這裏錯過了什麼?

+0

如果你需要更高的精度,或許'double'比'float'更好。 – 2012-01-31 17:37:21

+0

@typoknig「8675309」是一個巧合,還是與80年代的歌曲相吻合? – 2012-02-21 14:56:18

+0

不巧:-) – ubiquibacon 2012-02-22 11:54:58

回答

9

這是預期的。

如果你看看27.8675309二進制表示(27.867530822753906爲雙):

01000001110111101111000010110100 

下一個最高值是:

01000001110111101111000010110101 

這將產生27.867533(27.86753273010254爲雙)而下一個最低值是:

01000001110111101111000010110011 

其中產生27.867529(27.8675289 15405273爲雙)

目前根本沒有足夠的位在Float的尾數代表之間的任意值,讓你的價值在小數四捨五入到27.867530

+1

前兩個二進制數是相同的,但我想我明白你在說什麼。 – ubiquibacon 2012-01-31 17:30:09

+0

oops - 糾正! – Alnitak 2012-01-31 17:31:43

+0

另外,我清楚地知道,這不是一個小數點以外的事情,它是浮點數的指數和/或尾數沒有多少位的問題,是正確的嗎?其他一些浮點值可能有5個以上的小數位嗎? – ubiquibacon 2012-01-31 17:33:34

1

如參宿一中提到,您用盡了點。不過,您可以使用Double來獲得更高的精確度。 Double實現64位IEEE 754浮點,而Float實現32位IEEE 754浮點。