2012-07-31 51 views
5

我使用下面的方法得到錯誤的結果。獲得錯誤的結果以評估100 * 2.55值

public double evaluate(final double leftOperand, final double rightOperand) { 
     Double rtnValue = new Double(leftOperand * rightOperand); 
     return rtnValue.doubleValue(); 
    } 

輸入參數值是:leftOperand = 100和rightOperand = 2.55

我得到錯誤的答案:254.99999999999997

正確的答案是一個255.0

+4

強制性「什麼每臺計算機科學家應該知道關於浮點運算」 -link:http://docs.sun.com/source/806-3568/ncg_goldberg.html – Jacob 2012-07-31 10:11:02

+1

*確切*值做些什麼你相信你的「2.55」的價值? – 2012-07-31 10:11:14

+0

@JonSkeet:即使你知道2.55和100.0的確切值,答案也是錯的...... – 2012-07-31 10:17:06

回答

4

這是由於floating point precision problem。不可能在64位內表示每個有理數。數字存儲在IEEE 754 format中。

如果你正在創造一款遊戲,這還不夠好,即使是漂浮也行。但如果你正在做一些融資,那應該是正確的。那麼你可以使用java.math.BigDecimal。它比double慢得多,但它是正確的。而且它需要更多的內存,因爲你在內存中有一個確切的值。這裏有一個關於如何使用BigDecimal的好教程。

+0

謝謝,你的信息是非常有幫助的。 – iMBMT 2012-07-31 11:37:13

-1

使用Math.round()。

public static double evaluate(final double leftOperand, final double rightOperand) { 
     Double rtnValue = new Double(leftOperand * rightOperand); 
     return Math.round(rtnValue.doubleValue()); 
    }