JavaでBigDecimalを操作する関数

Java を使って浮動小数を計算する場合、BigDecimal クラスを利用しますが、
JavaでBigDecimalって取扱が面倒なんですよね。
普通の数量ならintやlongを使いたいと思うくらい。
それでも良くあるBigDecimalを使った関数を毎回調べるのも面倒なので備忘録。

BigDecimalの比較

BigDecimal同士を比較する時はcompareToを使います。
intの時は <、>、=など使えて楽ですが、BigDecimalの時はそれでは比較できないので注意が必要です。

BigDecimal price = new BigDecimal(0);
price = new BigDecimal(5);
if (price.compareTo(BigDecimal.ZERO) != 0 ) {
    // priceが0以外の時はここに入る
    System.out.println("priceは0以外");
}

// マイナスの時
price = new BigDecimal(-1);
if (price.compareTo(BigDecimal.ZERO) < 0) {
    System.out.println("priceは0より小さいマイナス");
} else {
    System.out.println("priceは0より大きいプラス");
}

BigDecimal three = new BigDecimal(3);
BigDecimal four = new BigDecimal(4);
// 3 < 4
if (three.compareTo(four) < 0) {
    System.out.println("result1 : < true");
}
if (three.compareTo(three) == 0) {
    System.out.println("result2 : = true");
}
if (four.compareTo(three) > 0) {
    System.out.println("result3 : > true");
}

BigDecimalの四則演算

BigDecimalでの四則演算は、add, subtract, multiplyを使用します。

BigDecimal pri1= new BigDecimal("1.00");
BigDecimal pri2 = new BigDecimal("2.00");
BigDecimal pri3 = new BigDecimal("3.00");
BigDecimal price = new BigDecimal(0);

// 足し算 add
price = new BigDecimal(0);
price = pri1.add(pri2 );

// 引き算 subtract
price = new BigDecimal(0);
price = pri3.subtract(pri2 );

// 掛け算 multiply
price = new BigDecimal(0);
price = pri2.multiply(pri3);

BigDecimalの丸め

setScaleの1番目の引数は丸め位置を指します。少数第3位で丸めたい場合はここの数値を変更します。

BigDecimal price = new BigDecimal(1.55);
// 切り捨て 少数第1位
price.setScale(0, BigDecimal.ROUND_DOWN);
1.55→1
// 切り捨て 少数第2位
price.setScale(1, BigDecimal.ROUND_DOWN);
1.55→1.5

// 切り上げ 少数第1位
price.setScale(0, BigDecimal.ROUND_UP);
1.55→2
// 切り上げ 少数第2位
price.setScale(1, BigDecimal.ROUND_UP);
1.55→1.6

// 四捨五入 少数第1位
price.setScale(0, BigDecimal.ROUND_HALF_UP);
1.55→2
// 四捨五入 少数第2位
price.setScale(1, BigDecimal.ROUND_HALF_UP);
1.55→1.6

int →BigDecimalへ型変換

金額を求める時、数量 * 金額と出来ないのもBigDecimalの面倒な所です。
両方ともBigDecimalならmultiplyを使えば良いのですが、数量がintの時、
まずは数量のintをBigDecimalに変換してからmultiplyで計算します。
long やdoubleも同様に変換できます。

int qty1 = 5; // 数量
BigDecimal unitPri= new BigDecimal(5000);

// int →BigDecimalへ型変換
BigDecimal big1 = BigDecimal.valueOf(qty1 );
BigDecimal price = big1.multiply(unitPri);

// long やdoubleも同様
long qty2= 222;
BigDecimal big2= BigDecimal.valueOf(qty2);

double qty3= 333.33;
BigDecimal big3= BigDecimal.valueOf(qty3);

BigDecimal→intへ型変換

稀に逆パターンもあります。数量をBigDecimalで扱っているけれど
java内部ではintで扱いたいみたいな時です。

BigDecimal big1 = new BigDecimal("50");
BigDecimal big2 = new BigDecimal("60");
BigDecimal big3 = new BigDecimal("123.45");

int num1 = big1.intValue();
long num2 = big2.longValue();
double num3 = big3.doubleValue();

コメント

タイトルとURLをコピーしました