我使用以下方法得到了错误的结果。
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
答案 0 :(得分:4)
这是由于floating point precision problem。不可能在64位内表示每个有理数。这些数字存储在IEEE 754 format。
中如果你正在创造一个游戏,这已经足够好了,即使浮动也可以。但如果你正在做一些融资,那应该是正确的。然后你可以使用java.math.BigDecimal
。它比double
慢得多,但它是正确的。它需要更多的内存,因为你在内存中有一个确切的值。这是一个很好的教程,介绍如何使用BigDecimal。
答案 1 :(得分:4)
使用BigDecimal
BigDecimal bd = new BigDecimal("100");
BigDecimal ans = bd.multiple(new BigDecimal("2.55"));
System.out.println(ans);
另见
答案 2 :(得分:-1)
使用Math.round()。
public static double evaluate(final double leftOperand, final double rightOperand) {
Double rtnValue = new Double(leftOperand * rightOperand);
return Math.round(rtnValue.doubleValue());
}