Javaには数値を扱う型として「float」や「double」などもありますが、小数点以下の正確な値の計算を行うためには「BigDecimal」を利用する必要があります。
本記事では、JavaにおけるBigDecimalの基本的な使い方をご紹介していきたいと思います。
目次
JavaのBigDecimalとは
BigDecimalではfloatやdoubleなどのように浮動小数点でデータを保管しない
BigDecimalでは、実数値を保存するための方法として、「整数値」と「小数点の位置」で管理する方法を採用しています。
「float」や「double」などの「浮動小数点」でデータを管理すると、小数点以下の値が自動的に丸められプログラマーの意図しない処理結果が返却されることが起こります。
BigDecimalでは「整数値」「小数点の位置」を別データとして管理することで、丸め誤差を起こさずに実数値の状態で保存することが可能になります。
Java BigDecimalクラスの基本的な使い方
BigDecimalクラスでは、四則演算用のメソッドが用意されており、四捨五入する際の条件や小数点以下の桁数を指定することが可能です。
基本となる四則演算をサンプルコードで確認しよう
まずは「足し算」「引き算」「掛け算」「割り算」の使い方をサンプルコードでご紹介していきます。
import java.util.*; import java.math.BigDecimal; // ※1 public class Main { public static void main(String[] args) throws Exception { BigDecimal sample1 = new BigDecimal("1.23"); BigDecimal sample2 = new BigDecimal("4.56"); BigDecimal addResult = sample2.add(sample1); // ※2 BigDecimal subtractResult = sample2.subtract(sample1); // ※3 BigDecimal multiplyResult = sample2.multiply(sample1); // ※4 BigDecimal divideResult = sample2.divide(sample1, 2, BigDecimal.ROUND_HALF_UP); // ※5 System.out.println("足し算(add)の結果= " + addResult); System.out.println("引き算(subtract)の結果= " + subtractResult); System.out.println("掛け算(multiply)の結果= " + multiplyResult); System.out.println("割り算(divide)の結果= " + divideResult); } }
サンプルコードを実行した結果が下記の通りとなります。
足し算(add)の結果= 5.79 引き算(subtract)の結果= 3.33 掛け算(multiply)の結果= 5.6088 割り算(divide)の結果= 3.71
まずBigDecimalクラスを利用するためには、※1の行でjava.mathパッケージをインポートしておく必要があります。
※2~5までがそれぞれ四則演算の処理で利用するメソッドとなっており、addは「足し算」、subtractは「引き算」、multiplyは「掛け算」、divideは「割り算」を行うために提供されたメソッドです。
※5の割り算の行ではdivideメソッドの第三引数に「BigDecimal.ROUND_HALF_UP」を指定しています。
BigDecimal.ROUND_HALF_UPは「四捨五入」することを指定する定数で、第二引数で指定した小数点以下の桁数になるように四捨五入処理が行われます。
今回のサンプルのようにdivideメソッドを利用して割り算を行なった結果、答えが無限小数となった場合「java.lang.ArithmeticException」が起こるため、サンプルのように丸め処理を指定する必要があります。
Java BigDecimalクラスで可能な丸め処理
JavaのBigDecimalクラスでは、四捨五入以外の丸め処理も多く提供されているため確認しておきましょう。
BigDecimalクラスの丸め処理で利用可能な定数一覧
まずは下記の表で丸め処理で利用出来る定数をご確認ください。
定数 | 説明 |
---|---|
ROUND_UP | 0から離れるように丸めるモード |
ROUND_DOWN | 0に近づくように丸めるモード |
ROUND_CEILING | 正の無限大に近づくように丸めるモード |
ROUND_FLOOR | 負の無限大に近づくように丸めるモード |
ROUND_HALF_UP | もっとも近い数字に丸めるモード(両隣の数字が等距離の場合は切り上げ) |
ROUND_HALF_DOWN | もっとも近い数字に丸めるモード(両隣の数字が等距離の場合は切り捨て) |
ROUND_HALF_EVEN | もっとも近い数字に丸めるモード(両隣の数字が等距離の場合は偶数側に丸める) |
ROUND_UNNECESSARY | 演算の結果が正確であり、丸めが必要ないことを表す丸めモード |
丸め処理の定数を使用したサンプルコードで確認しよう
setScaleメソッドを用いて小数点第二位で丸めるサンプルコードをご紹介していきます。
import java.util.*; import java.math.BigDecimal; public class Main { public static void main(String[] args) throws Exception { BigDecimal sampleRound = new BigDecimal("1.23456"); BigDecimal unnecessaryRound = new BigDecimal("1"); BigDecimal upResult = sampleRound.setScale(2, BigDecimal.ROUND_UP); BigDecimal downResult = sampleRound.setScale(2, BigDecimal.ROUND_DOWN); BigDecimal ceilingResult = sampleRound.setScale(2, BigDecimal.ROUND_CEILING); BigDecimal floorResult = sampleRound.setScale(2, BigDecimal.ROUND_FLOOR); BigDecimal halfUpResult = sampleRound.setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal halfDownResult = sampleRound.setScale(2, BigDecimal.ROUND_HALF_DOWN); BigDecimal halfEvenResult = sampleRound.setScale(2, BigDecimal.ROUND_HALF_EVEN); BigDecimal unnecessaryResult = unnecessaryRound.setScale(2, BigDecimal.ROUND_UNNECESSARY); System.out.println("ROUND_UPの結果= " + upResult); System.out.println("ROUND_DOWNの結果= " + downResult); System.out.println("ROUND_CEILINGの結果= " + ceilingResult); System.out.println("ROUND_FLOORの結果= " + floorResult); System.out.println("ROUND_HALF_UPの結果= " + halfUpResult); System.out.println("ROUND_HALF_DOWNの結果= " + halfDownResult); System.out.println("ROUND_HALF_EVENの結果= " + halfEvenResult); System.out.println("ROUND_UNNECESSARYの結果= " + unnecessaryResult); } }
サンプルコードを実行した結果が下記の通りとなります。
ROUND_UPの結果= 1.24 ROUND_DOWNの結果= 1.23 ROUND_CEILINGの結果= 1.24 ROUND_FLOORの結果= 1.23 ROUND_HALF_UPの結果= 1.23 ROUND_HALF_DOWNの結果= 1.23 ROUND_HALF_EVENの結果= 1.23 ROUND_UNNECESSARYの結果= 1.00
ROUND_UNNECESSARYに関しては、答えが無限小数になった場合「java.lang.ArithmeticException」が発生しますので、注意が必要です。
さいごに:Java BigDecimalクラスは正確な計算を行うために必要!
本記事では、JavaにおけるBigDecimalクラスの基本的な使い方についてご紹介してきました。
小数点以下の計算を行う際には必須のクラスとなっていますので、これまで曖昧に「float」や「double」と「BigDecimal」を混同していた方は、ぜひこの機会にプログラムで不具合を生まないよう、しっかりとそれぞれ使い分けられるように理解しておきましょう。
BigDecimalは正確な計算を行うために利用されるクラスで、小数点以下の数値を扱う際、意図しない丸め処理が行われない点が特徴です。