163

この 2 つの呼び出しの違いは何ですか? (ありますか?)

// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
4

2 に答える 2

248

ほのめかされているが直接対処されていない重要な点の1つは、 「精度」「スケール」の違いと、2つのステートメントでのそれらの使用方法です。 「精度」は、数値の有効桁数の合計です。 「スケール」は小数点以下の桁数です。

MathContextコンストラクターは、精度とRoundingModeのみを引数として受け入れるため、最初のステートメントでscaleが指定されることはありません。

setScale()明らかに、引数としてscaleとRoundingModeを受け入れますが、2番目のステートメントで精度が指定されることはありません。

小数点を1桁右に移動すると、違いが明確になります。

// 1.
new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP));
//result = 35.35
// 2.
new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP);
// result = 35.3456
于 2012-11-19T20:03:00.690 に答える
54

確かに大きな違いがあり、それを覚えておく必要があります。setScaleは実際に数値のスケールを設定しますが、roundは数値を指定された桁に丸めますが、jdk内で説明されているように、「正確な結果の左端の桁から開始」します。したがって、サンプルに関しては結果は同じですが、代わりに0.0034を試してください。これが私のブログでの私のメモです:

http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html

于 2011-06-27T16:20:07.557 に答える