1. ホーム
  2. java

[解決済み] BigDecimalのsetScaleとround

2022-04-25 02:22:27

質問

この2つの呼び出しの違いは何ですか?(何かあるのでしょうか?)

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

解決方法は?

重要な点として、言及はされているものの、直接的には取り上げられていないのが、以下の違いです。 "precision"。 "スケール" という2つの文の中でどのように使われているかを説明します。 "precision"。 は、数値の有効桁数の合計です。 "スケール" は小数点の右側の桁数です。

MathContext のコンストラクタは引数として precision と RoundingMode しか受け付けないため、最初のステートメントで scale が指定されることはない。

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