2011-11-11 90 views
5

這是Java中的一個小故障嗎?Java故障?減數字?

我去解決這個表達式:3.1 - 7.1

我得到了答案:-3.9999999999999996

這到底是怎麼回事?

+15

浮點算術是怎麼回事。 –

+0

查看[this](http://stackoverflow.com/questions/2798830/double-precision-values)和其他許多人的內容。 (嘿,WECSSKAFPN文章去哪了?) –

+2

這已經是最常見的編程問題了。 .... –

回答

10

一個很好的解釋可以在這裏找到。 http://www.ibm.com/developerworks/java/library/j-jtp0114/

浮點算術很少精確。雖然某些數字(如0.5)可以精確地表示爲二進制(基數2)小數(因爲 0.5等於2-1),但其他數字(如0.1)不能。因此,浮點運算可能會導致舍入錯誤,產生的結果接近 - 但不等於 - 您可能預期的結果 。例如,下面的結果簡單的計算在 2.600000000000001,而不是2.6:

double s=0; 

for (int i=0; i<26; i++) 
    s += 0.1; 
System.out.println(s); 

類似地,乘以0.1 * 26產生從的 加入0.1到自身的26倍的不同的結果。當從浮點數轉換爲整數時舍入錯誤變得更加嚴重 ,因爲轉換爲 整數類型會丟棄非整數部分,即使計算 「看起來像」它們應該具有整數值。例如, 以下語句:

double d = 29.0 * 0.01; 
    System.out.println(d); 
    System.out.println((int) (d * 100)); 

會產生作爲輸出:

0.29 
    28 

這可能不是你可能期望首先什麼。

有關更多信息,請參閱提供的參考。

1

電腦是100%所以在數學的世界是正確的,對一般人來說是不正確的。 Java不能在特定的數字上出現錯誤,因爲它只是運行相同方式但輸入不同的代碼!

P.S.谷歌如何把一個數字

+0

謝謝你。這真的很奇怪...... – Confiqure

+0

'Java不能有錯誤'?我從來沒有遇到過一個沒有錯誤的計算機系統.... –

+0

沒有我的意思是在一個簡單的補充,它就像說5 + 5將是正確的6 + 5不會, – Hego555

1

舍入誤差在浮點

同樣的方式,3 * 0.1 != 0.3

2

正如其他人所提到的,如果您希望得到精確的十進制值,例如double,則不能指望double。實施貨幣應用時。你應該做的是要仔細看看BigDecimal

BigDecimal a = new BigDecimal("3.1"); 
BigDecimal b = new BigDecimal("7.1"); 
BigDecimal result = a.subtract(b); 
System.out.println(result);  // Prints -4.0