4

重複の可能性:
小数点以下の桁数を2倍に移動

次の数の合計が等しくないのはなぜ0.4622ですか?しかし0.46219999999999994

Double total = new Double(0.08) + new Double(0.0491) + new Double(0.3218) + 
         new Double(0.0113) + new Double(0.0); // = 0.46219999999999994

ユーザーの入力をチェックするアプリケーションがあります。

ユーザーは5つの10進数と合計数を入力します。アプリケーションは、コンマの後ろの小数点以下4桁でキャップされた5つの数字すべての合計が合計数と等しいかどうかをチェックします。

それをキャップすると0.4621、に等しくないものが得られ0.4622ます。DecimalFormatは切り上げられるため、使用できません。そして、私が明示的に言うと、切り捨てると、この状況では失敗します。

これをどのように解決できるかについての提案はありますか?

4

10 に答える 10

12

で試してくださいjava.math.BigDecimal。ダブルラウンドが発生します。add+演算子ではなく、メソッドを使用する必要があります。

于 2013-01-08T14:56:08.303 に答える
5

正確な答えが必要な場合は、floatとdoubleの使用を避けてください-項目48-効果的なJava第2版

BigDecimal代わりに使用してください。

于 2013-01-08T14:56:56.110 に答える
3

浮動小数点演算を使用する場合は、適切な丸めも使用する必要があります。

ところで:プリミティブが使用する場合は、オブジェクトを使用しないでください。

double total = 0.08 + 0.0491 + 0.3218 + 0.0113 + 0.0;
System.out.printf("%.4f%n", total);

double rounded = Math.round(total * 1e4) / 1e4;
if (rounded == 0.4622)
    System.out.println("rounded matched");

プリント

0.4622
rounded matched

予想通り。

于 2013-01-08T15:00:54.867 に答える
3

浮動小数点演算の典型的なケースのように見えます。正確な計算が必要な場合は、を使用してjava.math.BigDecimalください。すべてのコンピューター科学者が浮動小数点演算について知っておくべきことを見てください

于 2013-01-08T14:57:01.183 に答える
2

Javaのdoubleとfloatは、内部的に2進小数として表されるため、小数を正確に表すことはできません(IEEE標準754)。10進数の計算に精度が必要な場合は、Java.math.BigDecimalを使用してください。

于 2013-01-08T15:00:59.173 に答える
2

浮動小数点表現は近似値であるため、floatとdoubleを使用すると、これらの小さな丸め誤差が発生します。たとえば、0.08をバイナリに変換しようとすると、実際には正確に変換できないことに気付くでしょう。計算でdoubleとfloatを使用する場合は、常にこれを考慮する必要があります。

0.08 10 = 0.00010100011110101110 ... 2

繰り返しパターン。したがって、使用するビット数に関係なく、これには丸め誤差があります。

于 2013-01-08T14:57:20.857 に答える
1

これは、さらに別の丸めの問題です。ダブルスを比較して、完全に等しいと期待してはいけません。代わりに、小さなエプシロンを定義し、結果が期待される答えのエプシロン内にあることを期待します。

于 2013-01-08T14:56:06.433 に答える
0

おそらく、文字列入力を直接チェックする方が現実的です。つまり、小数点以下の文字の長さをチェックします。

于 2013-01-08T15:00:09.207 に答える
0

浮動小数点値は不正確です。解決策、値を表示する必要がある場合にDecimalFormatを使用することです。いいえ、切り上げではなく、最も近い値になります。

javadocから:

DecimalFormatは、フォーマットに半偶数丸め(ROUND_HALF_EVENを参照)を使用します。

于 2013-01-08T14:57:11.977 に答える
0

Doubleのような浮動小数点数の内部表現は、正確なものになることはありません。これが、計算中にこのようなエラーが発生する可能性がある理由です。

このような結果は、コンマを超えた特定の桁数にフォーマットすることを常にお勧めします。これにより、結果は4〜15桁以上の「0.4622」として正しく表示されます。

于 2013-01-08T14:57:37.030 に答える