2

コンピューターは非整数を正確に表すことができないことを理解しています。たとえば、Javaで2つのdoubleを追加すると、次のようになります。

724.64d + 1000d

コンソールのプリントアウト1724.6399999999999

724.64d + 100dしかし、なぜ724.64d + 10000d

コンソールは824.64と10724.64を別々に印刷しますか?

2つの倍精度浮動小数点数を加算したときにどのような条件で合計が正確な数であるかを知る方法はありますか?

私が尋ねる理由は、私たちの古いプログラムが計算を行うためにdoubleを使用しているからです。二重比較を使用して数値を検証します。例:合計がであるとすると、合計1849.64されたすべての入力量は合計と等しくなければなりません。1849.64

input 1: 724.64
input 2: 1125

合計が1849.6399999999999になるため、機能しません

しかし、このように入力すると、以下が機能し、合計は1849.64になります。

input 1: 24.64
input 2: 1825

では、うまくいく組み合わせを見つける方法は?注意してください、私はこの特定の非常に古いプログラムにアクセスできません。検証が失敗した場合、2番目の入力の組み合わせのようなウォークアラウンドを手動で見つける必要があります。ありがとう。

4

5 に答える 5

2
BigDecimal bigDecimal = new BigDecimal(724.64);
bigDecimal = bigDecimal.add(new BigDecimal(1000.0));
System.out.println(bigDecimal.floatValue());<--Works fine 
System.out.println(bigDecimal.doubleValue());<--Works as mentioned in Question

出力:

1724.64
1724.6399999999999

最初のケースでは、narrowing primitive conversion起こるために機能します。しかし、浮動小数点数を使用すると、それを受け入れて対処する必要があります。

プリミティブに有効な理由を述べたように

double d = 724.64;
double d1 = 1000.0;
System.out.println(d + d1);
System.out.println((float) (d + d1));

出力:

1724.64
1724.6399999999999
于 2012-10-26T20:34:55.170 に答える
1

最後の質問に答えるために、小数部分が2 の負の累乗である場合、double は正確です。あなたが投稿したもののように、それらを10進数に変換するために使用するAPI(System.out.println()など)が丸めまたは切り捨てを行い、値が丸めまたは切り捨てが期待される答えをもたらすのに十分近い場合。

于 2012-10-26T20:56:55.593 に答える
1

浮動小数点数は 10 進数では表せませんが、2 進数では明らかに精度が有限であるため、10 進数で表す正確な値と浮動小数点数で表すことができる値には不一致があります。期待してはいけません。

于 2012-10-26T20:31:13.520 に答える
1

どの条件が正確または不正確な計算になるかを判断しようとするのではなく、これらの状況でBigDecimalを使用することを検討してください。

于 2012-10-26T20:36:46.023 に答える
0

比較が問題である場合、回避策として、文字列内の数値を小数点以下 2 桁でフォーマットし、丸めを行ってから、文字列を比較することをお勧めします。

        double expectNum = 1849.64;
        double resultNum = 1849.639999;

        String expectedString = String.format("%.2g%n", expectNum);
        String resultString = String.format("%.2g%n", resultNum);

        if(expectedString.equals(resultString)){
           //result matched
           //return true;
        }else{
           //return false;
        }
于 2012-10-26T20:37:33.563 に答える