2

重複の可能性:
Javaはフロートして倍増しますが、0.0 +0.1+…+0.1== 0.9000001を回避するにはどうすればよいですか?

Java androidでの二重乗算の精度の問題をどのように克服できますか?文字列値を二重値に変換していることに注意してください。

例:2つのdouble値を乗算する場合:

double d1 = Double.valueOf("0.3").doubleValue() * Double.valueOf("3").doubleValue();
System.out.println("Result of multiplication : "+d1);

次の結果が得られます:0.8999999999999999

私が得ている結果のいくつかはです。

0.6 * 3 = 1.7999999999999998;
0.2 * 0.2 = 0.04000000000000001;

上記の結果の代わりに、次の結果を取得したいと思います。

0.3 * 3 = 0.9;
0.6 * 3 = 1.8;
0.2 * 0.2 = 0.04;

私はそれを最も近い整数に丸めようとしているのではないことを覚えておいてください。

4

3 に答える 3

10

精度の問題を回避するために、実際にはjava.math.BigDecimalを使用する必要があり、常にBigDecimal(String)コンストラクターを使用する必要があります。

BigDecimal result = new BigDecimal("0.3").multiply( new BigDecimal("3.0") );
于 2011-11-12T10:58:27.650 に答える
1

問題は掛け算ではありません。Double.valueOf( "0.3")で始まります。その値を浮動小数点で正確に表すことはできません。java.math.BigDecimalを使用する必要があります。また、「すべてのコンピューター科学者が浮動小数点について知っておくべきこと」というタイトルのページをGoogleで検索する必要があります。

于 2011-11-12T14:25:36.567 に答える
0

残念ながら、私はあなたが求めていることを正確に行う簡単な方法を知りません。

Strelokが言うように、正確な結果が必要な場合は、浮動小数点型を使用しないでください。ただし、ほとんどの場合、出力の丸め精度を指定するだけで十分です。次のコードは、必要なものに近いものですが、完全ではありません。

System.out.printf("Result of multiplication : %.1g\n", d1);

printfの構文の詳細については、java.util.Formatterのドキュメントを参照してください。

于 2011-11-12T11:13:01.490 に答える