またもBigDecimal

こんどは割り算結果の小数部を四捨五入する処理で失敗した。

// foo, bar, fugu はすべて BigDecimal 型の変数です。
foo.multiply( bar ).divide( fugu, BigDecimal.ROUND_HALF_UP );

こんな処理を書いたのだが、divide後のスケールが0になるとなぜか勘違いしていて失敗した。スケールを指定しない場合の divide メソッドの結果は、割られる側(この場合は foo.multiply( bar ) の結果)のスケールと等しくなる。
上記 multiply メソッドの結果のスケールは foo のスケールと bar のスケールを足したものになる。

なので例えば、foo = 10, bar = 2.0 だった場合、 foo.multiply( bar ) = 20.0 であり、fugu = 6 とかだった場合は上記式の結果は 3 では無く、3.3 になってしまう。

で、以下のように修正。

foo.multiply( bar ).divide( fugu, 0, BigDecimal.ROUND_HALF_UP );

スケールをちゃんと指定しました。これで、小数点以下第一位を四捨五入してくれるはず。
われながらくだらないミスが多いなぁと思ってしまう。反省。