この2つの呼び出しの違いは何ですか? (何かありますか?)
// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
言及されているが直接対処されていない重要な点の1つは、"precision"と"scale"の違いと、2つのステートメントでの使用方法です。 "precision"は、数字の有効桁数の合計です。 "scale"は、小数点の右側の桁数です。
MathContextコンストラクターは、引数として精度とRoundingModeのみを受け入れるため、最初のステートメントでスケールが指定されることはありません。
setScale()
は明らかにRoundingModeと同様に引数としてscaleを受け入れますが、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