【Java】計算にはBigDecimalを使おう
実装していてBigDecimalに躓いたのでまとめておこうと思います。
BigDecimalとは
数字の計算において、誤差を出さないためにはBigDecimalを使う必要があります。
BigDecimalはクラスなので、インスタンスを生成して使います。
BigDecimal bd1 = new BigDecimal("1");
BigDecimalを使わないと?
では、BigDecimalを使わないとどのような計算結果になるか試してみたいと思います。
// BigDecimalなしで計算 System.out.println(1.2 * 3);
結果は3.6となってほしいところですが実際の結果は・・・
3.5999999999999996
誤差が出てしまっていることが分かると思います。
BigDecimalで計算してみよう
誤差を出さないようにBigDecimalを使って計算してみようと思います。
// BigDecimalで計算 BigDecimal bd1 = new BigDecimal("1.2"); BigDecimal bd2 = new BigDecimal("3"); System.out.println(bd1.multiply(bd2));
すると結果はこのようになりました。
3.6
誤差なく計算できていますね。
BigDecimalクラスのメソッド
誤差が出ないことが確認できたので、基本的な使い方を見ていきます。
- BigDecimal#add
- BigDecimal#subtract
- BigDecimal#multiply
- BigDecimal#divide
上から順、足し算、引き算、掛け算、割り算をする時に使います。
- BigDecimal#setScale
四捨五入や切り上げ、切り捨てをするときに使います。
第一引数:変換後の小数点以下の桁数を設定します。
(小数第三位で四捨五入して、少数点以下2桁で表示する場合は2を設定します。)
第二引数:丸め方を指定します。
四捨五入 BigDecimal.ROUND_HALF_UP
切り上げ BigDecimal.ROUND_UP
切り捨て BigDecimal.ROUND_DOWN
実際に動かしたソースと結果を張っておきます。
// BigDecimalで計算 BigDecimal bd1 = new BigDecimal("1.2"); BigDecimal bd2 = new BigDecimal("3"); // 足し算 System.out.println("足し算"); System.out.println(bd1.add(bd2)); // 引き算 System.out.println("引き算"); System.out.println(bd1.subtract(bd2)); // 掛け算 System.out.println("掛け算"); System.out.println(bd1.multiply(bd2)); // 割り算 System.out.println("割り算"); System.out.println(bd1.divide(bd2)); BigDecimal bd3 = new BigDecimal("1.25"); // 四捨五入 System.out.println("四捨五入"); System.out.println(bd3.setScale(1, BigDecimal.ROUND_HALF_UP)); // 切り上げ System.out.println("切り上げ"); System.out.println(bd3.setScale(1, BigDecimal.ROUND_UP)); // 切り捨て System.out.println("切り捨て"); System.out.println(bd3.setScale(1, BigDecimal.ROUND_DOWN));
結果はこのようになりました。
足し算 4.2 引き算 -1.8 掛け算 3.6 割り算 0.4 四捨五入 1.3 切り上げ 1.3 切り捨て 1.2
演算を行うときは意識してBigDecimalを使わないと
思わぬバグを作りこんでしまいますね。
それでは今回は以上です(^^)/
お疲れさまでした♪
最後にアプリの宣伝させてください(*^-^*)