【Java】BigDecimalを使って小数点以下の計算を正確に行う!
小数点以下の計算を正確に行う場合にはBigDecimalクラスを使用します。
例えば、BigDecimalクラスを使わずに少数を計算すると以下のようになります。
例
1 2 3 4 5 6 |
public class Main { public static void main(String[] args) throws Exception { System.out.println(158.17 * 50); } } |
出力結果
7908.499999999999
このように少数を扱う場合、丸め誤差が発生するケースがあります。
なぜこうなるのかというと、Javaは数値を2進数で扱っていて、2進数では10進数の少数値を正確に表すことができなからです。
そのため、小数点以下を正確に扱う為には、BigDecimalクラスを使用します。
今回はBigDecimalクラスを使って以下の場合での小数点以下の計算を正確に行います。
⚫︎ 小数点以下の足し算を正確に行う場合
⚫︎ 小数点以下の引き算を正確に行う場合
⚫︎ 小数点以下の掛け算を正確に行う場合
⚫︎ 小数点以下の割り算を正確に行う場合
目次
BigDecimalクラスとは
BigDecimalクラスとは、誤差が出ないように正確にしたい場合に使用するクラスとなります。
銀行の金額計算など、数字の誤差が許されない場合に使われます。
しかし、BigDecimallクラスによる演算は時間がかかるので、精度よりも処理速度が求められる場合はプリミティブ型を使うようにしましょう。
BigDecimalクラスの書き方
BigDecimalクラスの書き方は下記となります。
1 |
import java.math.BigDecimal; |
BigDecimalクラスを使用する場合はBigDecimalをインポートする必要があります。
BigDecimalクラスの計算用メソッドについて
BigDecimallクラスの主要な計算用メソッドは、次のようになります。
足し算のaddメソッド、引き算のsubtractメソッド、掛け算のmultiplyメソッド、割り算のdivideメソッドなど、いくつかの計算用メソッドが用意されています。
メソッド | 演算名 |
---|---|
BigDecimal.add | 加算 |
BigDecimal.subtract | 減算 |
BigDecimal.multiply | 乗算 |
BigDecimal.divide | 除算 |
BigDecimal.remainder | 剰余算 |
除算を行うBigDecimalクラスのdivide()メソッドでは、正確な商の小数点以下が無限となる計算を行った場合、「ArithmeticException」例外が発生します。
その場合には、第2パラメータに丸めモードを設定して計算結果を丸めることが可能です。
小数点以下の計算を正確に行うサンプルコード
足し算の場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 小数点以下を正確に扱う import java.math.BigDecimal; public class Main { public static void main(String[] args) throws Exception // BigDecimalを使って同様の計算を行う BigDecimal bd1 = new BigDecimal("158.17"); BigDecimal bd2 = new BigDecimal("50"); BigDecimal bd3 = bd1.add(bd2); System.out.println("BigDecimalでの足し算: " + bd3); } } |
出力結果
BigDecimalでの足し算: 208.17
BigDecimalクラスのaddメソッドによって小数点以下の足し算を正確に行っています。
引き算の場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 小数点以下を正確に扱う import java.math.BigDecimal; public class Main { public static void main(String[] args) throws Exception { // BigDecimalを使って同様の計算を行う BigDecimal bd1 = new BigDecimal("158.17"); BigDecimal bd2 = new BigDecimal("50.567"); BigDecimal bd3 = bd1.subtract(bd2); System.out.println("BigDecimalでの引き算: " + bd3); } } |
出力結果
BigDecimalでの引き算: 107.603
BigDecimalクラスのsubtractメソッドによって小数点以下の引き算を正確に行っています。
掛け算の場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 小数点以下を正確に扱う import java.math.BigDecimal; public class Main { public static void main(String[] args) throws Exception { // BigDecimalを使って同様の計算を行う BigDecimal bd1 = new BigDecimal("158.17"); BigDecimal bd2 = new BigDecimal("50"); BigDecimal bd3 = bd1.multiply(bd2); System.out.println("BigDecimalでの掛け算: " + bd3); } } |
出力結果
BigDecimalでの掛け算: 7908.50
BigDecimalクラスのmultiplyメソッドによって小数点以下の掛け算を正確に行っています。
割り算の場合
例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 小数点以下を正確に扱う import java.math.BigDecimal; public class Main { public static void main(String[] args) throws Exception { // BigDecimalを使って同様の計算を行う BigDecimal bd1 = new BigDecimal("158.17"); BigDecimal bd2 = new BigDecimal("50"); BigDecimal bd3 = bd1.divide(bd2); System.out.println("BigDecimalでの割り算: " + bd3); } } |
出力結果
BigDecimalでの割り算: 3.1634
BigDecimalクラスのdivideメソッドによって小数点以下の割り算を正確に行っています。
今回のポイント
BigDecimalクラスで計算を正確に行う
乱数を取得するにはMathクラスのrandom()メソッドを使用する。
⚫︎ BigDecimalクラスで小数を扱う演算の丸め誤差を正確に求めることができる
⚫︎ BigDecimalクラスには、足し算のaddメソッド、引き算のsubtractメソッド、掛け算のmultiplyメソッド、割り算のdivideメソッドを始め、いくつかの計算用メソッドがある
⚫︎ BigDecimallクラスによる演算は時間がかかるため、精度よりも処理速度が求められる場合はプリミティブ型を使用する
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。