【Java入門】BigDecimalを用いた計算、比較について

プログラミング

皆さんこんにちは、TaroTechです。

今回は、「JavaにおけるBigDecimalクラス」について四則演算と比較のやり方を分かりやすくサンプルコードとともに解説していきます。

この記事で解説すること
  • BigDecimalとは
  • BigDecimalを用いた計算(足し算、引き算、掛け算、割り算)
  • BigDecimal同士の比較

1.BigDecimalとは

BigDecimalとは、Javaにおいて誤差が出ないように計算するためのクラスのことです。

特に小数などを扱う場合にdouble型やfloat型を用いると誤差が発生してしまう場合があるため、BigDecimalは小数計算などによく使われます。

例えば、

import java.math.BigDecimal;

public class Training1 {

	public static void main(String[] args) {
		// BigDecimal型を用いない計算
		System.out.println(1 - 0.9);

		// BigDecimal型の計算
		BigDecimal decimal1 = new BigDecimal("1");
		BigDecimal decimal2 = new BigDecimal("0.9");
		System.out.println(decimal1.subtract(decimal2));

	}
}
実行結果

上記のように同じ1-0.9でもBigDecimalを使う場合と使わない場合で計算結果に違いが出ました。

誤差を発生させないという特徴を持つことから、BigDecimalは主にオンラインショッピングといった金額計算をさせるような場合に用いるべきクラスになります。

2.BigDecimalの宣言の仕方

まず、1や2.5といった整数、小数や文字列ををBigDecimalとして宣言するためには、「newキーワード」もしくは「valueOf()メソッド」をつかってオブジェクトを作る必要があります。

構文

BigDecimal 変数名 = BigDecimal.valueOf(int型の値や変数 or double型の値や変数);
BigDecimal 変数名 = new BigDecimal(“数字の文字列”);

//int型やdouble型から生成する場合
BigDecimal decimal1 = BigDecimal.valueOf(100);
BigDecimal decimal2 = BigDecimal.valueOf(100.0);
//文字列から生成する場合
BigDecimal decimal3 = new BigDecimal("12345");

ちなみに、0と1と10は定義済みなので

BigDecimal decimal0 = BigDecimal.ZERO;
BigDecimal decimal1 = BigDecimal.ONE;
BigDecimal decimal10 = BigDecimal.TEN;

としてください。

3.BigDecimalの四則演算

次にBigDecimalを用いた四則演算のやり方を解説します。

3-1.BigDecimalの足し算

足し算を行う場合は、「add()メソッド」を使用します。

import java.math.BigDecimal;

public class Training3 {

	public static void main(String[] args) {
		// BigDecimalの足し算
		BigDecimal num1 = BigDecimal.valueOf(9);
		BigDecimal num2 = BigDecimal.valueOf(3);
		BigDecimal answer = num1.add(num2);
		System.out.println(answer);
	}
}
実行結果

3-2.BigDecimalの引き算

引き算を行う場合は、「subtract()メソッド」を使用します。

import java.math.BigDecimal;

public class Training4 {

	public static void main(String[] args) {
		// BigDecimalの引き算
		BigDecimal num1 = BigDecimal.valueOf(9);
		BigDecimal num2 = BigDecimal.valueOf(3);
		BigDecimal answer = num1.subtract(num2);
		System.out.println(answer);
	}
}
実行結果

3-3. BigDecimalの掛け算

掛け算を行う場合は、「multiply()メソッド」を使用します。

import java.math.BigDecimal;

public class Training5 {

	public static void main(String[] args) {
		// BigDecimalの掛け算
		BigDecimal num1 = BigDecimal.valueOf(9);
		BigDecimal num2 = BigDecimal.valueOf(3);
		BigDecimal answer = num1.multiply(num2);
		System.out.println(answer);
	}
}
実行結果

3-4. BigDecimalの割り算

割り算を行う場合は、「divide()メソッド」を使用します。

import java.math.BigDecimal;

public class Training6 {

	public static void main(String[] args) {
		// BigDecimalの割り算
		BigDecimal num1 = BigDecimal.valueOf(9);
		BigDecimal num2 = BigDecimal.valueOf(3);
		BigDecimal answer = num1.divide(num2);
		System.out.println(answer);
	}
}
実行結果

ちなみに、割り切れない場合はどうなるかというと

import java.math.BigDecimal;

public class Training6 {

	public static void main(String[] args) {
		// BigDecimalの割り算(割り切れない場合)
		BigDecimal num1 = BigDecimal.valueOf(5);
		BigDecimal num2 = BigDecimal.valueOf(3);
		BigDecimal answer = num1.divide(num2);
		System.out.println(answer);
	}
}

上記のように、「java.lang.ArithmetricException」という例外が発生するので「scale」と「メソッド」を用いて四捨五入などを行うとよいです。

具体的には、

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Training6 {

	public static void main(String[] args) {
		// BigDecimalの割り算
		BigDecimal num1 = BigDecimal.valueOf(5);
		BigDecimal num2 = BigDecimal.valueOf(3);
		BigDecimal answer = num1.divide(num2, 2, RoundingMode.HALF_UP);
		System.out.println(answer);
	}
}
実行結果

num1.divide(num2, 2, RoundingMode.HALF_UP)」と記述することで、num1をnum2で割った商の小数点第1位から数えて2番目(小数点第3位)を四捨五入するという意味になります。
そのため実行結果はエラーが起こることなく「1.67」と表示されます。

3-5.四則演算まとめ

BigDecimalを用いた四則演算は以下のようにまとめられます。

値1 + 値2値1.add(値2)
値1 - 値2値1.subtract(値2)
値1 × 値2値1.multiply(値2)
値1 ÷ 値2値1.divide(値2)
(※割り切れないときはscaleとメソッドで四捨五入しよう)

4.BigDecimal同士の大小比較

BigDecimalはクラスであるため、「<、>=」といった比較演算子を用いて大小比較することはできません。

そこで使用するのが「compareTo()メソッド」になります。

import java.math.BigDecimal;

public class Training7 {

	public static void main(String[] args) {
		BigDecimal num1 = new BigDecimal("5");
		BigDecimal num2 = BigDecimal.valueOf(4.55);
		
		//大小比較
		System.out.println(num1.compareTo(num2));
		System.out.println(num1.compareTo(num1));
		System.out.println(num2.compareTo(num1));

	}

}
実行結果

compareTo()メソッドを用いてBigDecimal同士を比較すると結果は「1、0、-1」のいずれかが返ってきます。
それぞれ比較結果と照らし合わせてまとめると、

BigDecimal同士の値1と値2を比較した場合、
値1 < 値2なら返り値は、-1
値1 = 値2 なら返り値は、0
値1 > 値2 なら返り値は、1
となります。(返り値の型はint型)

基本データ型の比較とは返ってくる結果が異なるので注意しましょう。

まとめ

皆さんいかがだったでしょうか。
今回はJavaにおけるBigDecimalの四則演算と比較のやり方について解説してきました。

BigDecimalはクラスなので四則演算や比較を行う際はメソッドを用いてコードを記述します。int型やdouble型のような基本データ型よりも少し煩雑ではありますが、正確に計算できるという大きな特徴がありますので場合に応じてうまく使い分けるようにしましょう。

コメント

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