2013-09-29 40 views
1
double check =0.615 * 255 -0.515 * 255 -0.100 * 255; 
System.out.println(check); 

爲什麼要得到-2.8421709430404007E-14?它應該是0.0在java中雙擊打印並得到錯誤的答案

+0

http://stackoverflow.com/a/177512/887149看到這個帖子 – Mohayemin

+0

@JunedAhsan因爲當你使用的計算來計算應該是0,原因156.825- 131.325-25.5 = 0 – Rebecca

回答

3

雙操作有一些精度問題。使用BigDecimal操作而不是雙倍,你會得到預期的結果。

//double check =0.615 * 255 + -0.515 * 255 + -0.100 * 255; 
    BigDecimal check = 
      (BigDecimal.valueOf(0.615).multiply(BigDecimal.valueOf(255))) 
      .add(BigDecimal.valueOf(-0.515).multiply(BigDecimal.valueOf(255))) 
      .add(BigDecimal.valueOf(-0.100).multiply(BigDecimal.valueOf(255))); 

    System.out.println(check); 

結果爲:0.000

+0

非常感謝你 – Rebecca

1

調試你的數學:

double check0 = 0.615 * 255; 
System.out.println(check0); 
double check1 = -0.515 * 255; 
System.out.println(check1); 
double check3 = -0.100 * 255; 
System.out.println(check3); 
System.out.println("Result: " + (check0 + check1 + check3)); 

輸出:

156.825 
-131.32500000000002 
-25.5 
Result: -2.8421709430404007E-14 

記住:

  • 乘法具有更高的運算符的優先級比加法中的Java
  • 你如果喲,應該使用BigDecimal你想控制四捨五入 當執行操作與浮點數
+0

但check2應該是131.325而不是131.3250000000002 – Rebecca

+0

@Rebecca這就是爲什麼你想在這種情況下使用'BigDecimal'而不是'double'的原因。還請查看[this](http://stackoverflow.com/questions/322749/retain-precision-with-doubles-in-java)SO頁面,以便開始使用Hows和Whys。 – Mena

+0

BigDecimal是答案,謝謝! – Rebecca