5

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

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

输入参数值为:leftOperand=100 and rightOperand=2.55

我得到了错误的答案: 254.99999999999997

正确答案是255.0

4

3 回答 3

4

这是由于浮点精度问题。不可能在 64 位内表示所有有理数。这些数字以IEEE 754 格式存储。

如果您正在创建游戏,这已经足够了,甚至浮动也可以。但如果你在做一些金融,它应该是正确的。然后你可以使用java.math.BigDecimal. 它比它慢得多,double但它是正确的。而且它需要更多的内存,因为你在内存中有一个精确的值。这是一个关于如何使用BigDecimal的不错的教程。

于 2012-07-31T10:10:29.933 回答
4

利用BigDecimal

BigDecimal bd = new BigDecimal("100");
BigDecimal ans = bd.multiple(new BigDecimal("2.55"));
System.out.println(ans);

也可以看看

于 2012-07-31T10:10:40.500 回答
-1

使用 Math.round()。

public static double evaluate(final double leftOperand, final double rightOperand) {
        Double rtnValue = new Double(leftOperand * rightOperand);
        return Math.round(rtnValue.doubleValue());
    }
于 2012-07-31T10:28:48.563 回答