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();
コメント