Java
BigDecimal
setScale
Tech FunDay 11

【小ネタ】紛らわしいメソッド名(setScaleのせいで時間を無駄にした話。

More than 1 year has passed since last update.

はじめに

数字の精度を扱うような業務に携わらないとなかなか使うことがないのがBigDecimalクラス。んで、久しぶりにいじったらとってもはまってしまい時間を無駄にした、というお話。

関連メソッド

BigDecimal
setScale(int newScale)
setScale(int newScale, int roundingMode)
setScale(int newScale, RoundingMode roundingMode)

プログラム仕様

処理結果を小数点以下1桁で表示する

プログラム

public static void main (String[] args) {

    BigDecimal deci = new BigDecimal("1.2345");

    System.out.println("deci 1:" + deci);

    deci.setScale(1, BigDecimal.ROUND_DOWN);

    System.out.println("deci 2:" + deci);

}

実行結果

deci 1:1.2345
deci 2:1.2345

???

さて、この実行結果が出たことで、作業が丁寧な方は、まずJavaDoc、となるでしょうし、勘の良い方は「あぁ、、、」となるんでしょうが、私は無駄にあれこれと、、、解決までにかれこれ20分くらい時間がかかってしまいました。。。(><)。なんでや?と。。。

プログラム2

public static void main (String[] args) {

    BigDecimal deci = new BigDecimal("1.2345");

    System.out.println("deci     1 :" + deci);

    deci.setScale(1, BigDecimal.ROUND_DOWN);

    System.out.println("deci     2 :" + deci);

    BigDecimal deciDecci = deci.setScale(1, BigDecimal.ROUND_DOWN);

    System.out.println("deciDecci  :" + deciDecci);
}

実行結果2

deci 1 :1.2345
deci 2 :1.2345
deciDecci :1.2

結論

結局、setScaleはインスタンスの内容を変更するものではなく、返り値を返すメソッドだったんですよね。。。それならせめてtoString()的な名前にして欲しかったという気もしつつ、やはり丁寧にJavaDoc一回見とけばよかったな、と。Calendarクラスとか他にもいろいろsetとかsetXXXってのあるけどもなぁ。