获得错误的结果以评估100 * 2.55的值

时间:2012-07-31 10:09:18

标签: java

我使用以下方法得到了错误的结果。

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

3 个答案:

答案 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());
    }