5

以下の方法を使用すると、間違った結果が得られます。

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

3 に答える 3

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 に答える
4

これは、浮動小数点の精度の問題が原因です。64ビット内のすべての有理数を表すことは不可能です。番号はIEEE754形式で保存されます。

ゲームを作成している場合、これで十分です。フロートでも十分です。しかし、あなたがいくらかの財政をしているならば、それは正しいはずです。次に、を使用できますjava.math.BigDecimal。それよりもはるかに遅いですdoubleが、それは正しいです。また、メモリに正確な値があるため、より多くのメモリが必要になります。これは、 BigDecimalの使用方法に関する優れたチュートリアルです。

于 2012-07-31T10:10:29.933 に答える
-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 に答える