2011-06-23 545 views
6

Java中double值的乘法運算符的保證精度是多少?java中雙精度乘法的精度?

例如,2.2 * 100是220.00000000000003,但是220是雙數。 220.00000000000003是後220

+1

大巴山:這取決於你的號碼multiplicating,看到浮點數字是如何在Java中實現(在大多數語言)。 Java中的浮點數主要是IEEE-754。我建議引人入勝的閱讀:*「每個計算機科學家應該知道的浮點數字」* http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html請注意「科學家「的名字:如果你沒有進行科學的計算,如果你使用浮點數,你可能是錯誤的。 – SyntaxT3rr0r

+0

- 關閉ulp! – Atreys

回答

6

乘法工作正常,但2.2不能完全按照雙表示。最近的雙打:

  • 2.199999999999999733(0x4001999999999999)
  • 2.200000000000000177(0x400199999999999a)

一些軟件將打印後的值作爲2.2,但這並不意味着它是精確的。這只是意味着它被視爲「足夠接近」。

+0

謝謝,我錯誤地認爲事實println打印2.2意味着它是確切的 –

3

下一個雙重如果您正在使用財務數據時不使用float or double只需使用java.math.BigDecimal

+1

謝謝,但這不是我問的問題 –

+0

你問過double的倍數,試着做同樣的操作,但只是使用BigDecimal,你的問題就解決了。 –

+1

我的問題是關於乘法運算的準確性,因爲我讀過[每個計算機科學家應該知道的關於浮點數的內容](http://download.oracle.com/docs/cd/E19957-01/806 -3568/ncg_goldberg.html)「IEEE標準要求加法,減法,乘法和除法的結果完全取整。也就是說,結果必須精確計算,然後四捨五入到最接近的浮點數(使用round到even)。「,我驚訝地收到了我沒有預料到的答案。@duskwuff在下面解釋了爲什麼會發生這種情況。 –

0

可以使用BigDecimal的,但要確保你使用的BigDecimal(串)的結構,而不是的BigDecimal(雙)。它們之間的區別是:

enter image description here