いくつかの計算のために間違った結果を返すBigDecimalを除算

XtremeBaumer:

私は、ポイント数とその数学をflaotingに関するいくつかの質問を読みました。問題は唯一の大きなスケール(すなわち10+小数)で起こるように私には見えます。今私の問題は、いくつかのケースでは2つのすでに小数とその非常に大きなオフで起こります。

次のコード:

System.out.println(
        String.format("%.2f", BigDecimal.valueOf(2.8).divide(BigDecimal.valueOf(3.87), 2).doubleValue()));
System.out.println(
        String.format("%.2f", BigDecimal.valueOf(2.41).divide(BigDecimal.valueOf(2.73), 2).doubleValue()));

それぞれ、この出力を生成します。

0.80
0.89

私は(Googleの計算を使用して)手で計算を実行した場合、私はこれらの結果を得ます:

0.72351421188
0.88278388278

最初の計算のための結果は非常に低い(〜0.01オフ)は、第2の1のためしばらく(〜0.08オフ)は本当に大きいです。

チエニル最初の結果がその大きい理由として、いくつかのまともな説明がありますか?使用して正しい結果を取得するか、どのような方法BigDecimal

ご了承ください

System.out.println(2.8/3.87);

実際には右の結果(0.7235142118863048)を返します。

またことに注意してくださいString.formatものは結果だけがそうではありませんそれによって変更されたかどうかを確認するために使用されます。BigDecimal.valueOf(2.8).divide(BigDecimal.valueOf(3.87), 2).doubleValue()正確に同じ結果が得られます。

ケビンCruijssen:

問題は、あなたが間違って使用しているということですBigDecimal#divide、あなたは2つの小数に丸めるために。ここで使用可能な引数ですBigDecimal#divide方法は:

  • divide(BigDecimal divisor)
  • divide(BigDecimal divisor, int roundingMode)
  • divide(BigDecimal divisor, MathContext mc)
  • divide(BigDecimal divisor, RoundingMode roundingMode)
  • divide(BigDecimal divisor, int scale, int roundingMode)
  • divide(BigDecimal divisor, int scale, RoundingMode roundingMode)

あなたが使用しているのでdivideBigDecimalし、int引数、それゆえ使用してdivide(BigDecimal divisor, int roundingMode)、あなたはどこ、2丸めモードとではありません規模。この場合、2実際にはROUND_CEILING、スケールが指定されていません。

代わりに、あなたはどちらかを使用する必要がありますdivide(BigDecimal divisor, int scale, int roundingMode)divide(BigDecimal divisor, int scale, RoundingMode roundingMode)だからあなたの呼び出しを次のように変更します

System.out.println(BigDecimal.valueOf(2.8).divide(BigDecimal.valueOf(3.87), 2, 
  BigDecimal.ROUND_HALF_UP));
System.out.println(BigDecimal.valueOf(2.41).divide(BigDecimal.valueOf(2.73), 2, 
  BigDecimal.ROUND_HALF_UP));

(以外の丸めモードを使用する自由を感じますROUND_HALF_UP。)

オンラインそれを試してみてください。

私はそれがデフォルトで使用していますが、スケールのかわからないんだけどROUND_CEILING、あなたに指定した2あなたの計算で発生する問題。


言及したコメントについては、作成するための3つの方法があるBigDecimal指定された値とは:

  • BigDecimal.valueOf(2.8)
  • new BigDecimal(2.8)
  • new BigDecimal("2.8")

new BigDecimal(2.8)それでも私はどちらかを使用するアドバイスですので、ポイントエラーを浮動与えBigDecimal.valueOf(2.8)、あなたが既に行ったように、またはStringコンストラクタnew BigDecimal("2.8")

オンラインそれを試してみてください。

正しい使用したので、これは、しかし、あなたの丸めの問題のために、全てのビットは無関係であるdivide方法は関係なく、正しい結果が得られますBigDecimalあなたが使用した初期設定:

オンラインそれを試してみてください。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=278845&siteId=1