この 2 つの呼び出しの違いは何ですか? (ありますか?)
// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
この 2 つの呼び出しの違いは何ですか? (ありますか?)
// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
ほのめかされているが直接対処されていない重要な点の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
確かに大きな違いがあり、それを覚えておく必要があります。setScaleは実際に数値のスケールを設定しますが、roundは数値を指定された桁に丸めますが、jdk内で説明されているように、「正確な結果の左端の桁から開始」します。したがって、サンプルに関しては結果は同じですが、代わりに0.0034を試してください。これが私のブログでの私のメモです:
http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html