【Java入門】BigDecimalの使い方総まとめ(足し算、引き算などの計算)

こんにちは!エンジニアの中沢です。

Javaには誤差が出ないように正確に計算するためのBigDecimalクラスがあります。double型を使うと誤差が出て、正確に計算ができなかった経験はないでしょうか?

この記事では、

  • BigDecimalとは
  • BigDecimalの使い方(足し算、引き算)

という基本的な内容から、

  • setScaleで桁数を指定して四捨五入
  • compareToでBigDecimalの値を比較
  • BigDecimalの型変換

などの応用的な使い方に関しても解説していきます。今回はこれらの方法を覚えるために、BigDecimalクラスのさまざまな使い方をわかりやすく解説します!

なお、Javaの記事については、こちらにまとめています。

目次

BigDecimalとは

BigDecimalは誤差が出ないように正確に計算するために使います。

また、四捨五入などの丸め処理の方法桁数を指定するためにも使います。BigDecimalを使わない場合にどのような誤差が出るのか、次のプログラムで確認してみましょう。

import java.math.BigDecimal;
 
public class Main {
 
    public static void main(String[] args) {
        System.out.println("BigDecimalを使わない場合");
        System.out.println("1 - 0.9 = " + (1 - 0.9) + "n");
 
        System.out.println("BigDecimalを使う場合");
        BigDecimal bdNum1 = new BigDecimal("1");
        BigDecimal bdNum2 = new BigDecimal("0.9");
        System.out.println("1 - 0.9 = " + bdNum1.subtract(bdNum2));
    }
}

実行結果:

BigDecimalを使わない場合
1 - 0.9 = 0.09999999999999998
 
BigDecimalを使う場合
1 - 0.9 = 0.1

このプログラムの実行結果から、BigDecimalを使わない場合には誤差が発生することが確認できました。

BigDecimalの使い方(足し算、引き算)

ここではBigDecimalで四則演算を行う基本的な使い方を解説します。

BigDecimalで四則演算を行う方法を次のプログラムで確認してみましょう。

import java.math.BigDecimal;
 
public class Main {
 
    public static void main(String[] args) {
 
        BigDecimal ten = BigDecimal.valueOf(10);
        BigDecimal three = BigDecimal.valueOf(3);
 
        System.out.println(ten + " + " + three + " = " + ten.add(three));
        System.out.println(ten + " - " + three + " = " + ten.subtract(three));
        System.out.println(ten + " * " + three + " = " + ten.multiply(three));
        System.out.println(ten + " / " + three + " = " + ten.divide(three, 1, BigDecimal.ROUND_HALF_UP));
    }
}

実行結果:

10 + 3 = 13
10 - 3 = 7
10 * 3 = 30
10 / 3 = 3.3

このプログラムでは、足し算、引き算、掛け算、割り算をそれぞれ行って結果を表示しています。

割り算では引数で四捨五入して、小数点以下の桁数を1桁にするように指定しています。BigDecimalの計算をする方法についてはこちらで詳しく解説しているので、ぜひ確認してください!

setScaleで桁数を指定して四捨五入

ここではsetScaleメソッドで四捨五入などの丸め処理をする方法を解説します。

四捨五入などの丸め処理を行う方法を次のプログラムで確認してみましょう。

import java.math.BigDecimal;
 
public class Main {
 
    public static void main(String[] args) {
 
        BigDecimal bdNum1 = new BigDecimal("12.3456");
 
        BigDecimal result1 = bdNum1.setScale(1, BigDecimal.ROUND_HALF_UP);
        BigDecimal result2 = bdNum1.setScale(1, BigDecimal.ROUND_UP);
        BigDecimal result3 = bdNum1.setScale(1, BigDecimal.ROUND_DOWN);
 
        System.out.println("小数第2位を四捨五入:" + result1);
        System.out.println("小数第2位を切り上げ:" + result2);
        System.out.println("小数第2位を切り捨て:" + result3);
    }
}

実行結果:

小数第2位を四捨五入:12.3
小数第2位を切り上げ:12.4
小数第2位を切り捨て:12.3

このプログラムでは小数点以下の桁数を指定して、四捨五入、切り上げ、切り捨ての処理をしています。

BigDecimalで四捨五入などの丸め処理をする方法についてはこちらで詳しく解説しているので、ぜひ確認してください!

compareToでBigDecimalの値を比較

最後にBigDecimalの値を比較する方法を解説します。

BigDecimalの値はcompareToメソッドを使って大小の比較をすることができますcompareToメソッドを使って比較する方法を次のプログラムで確認してみましょう。

import java.math.BigDecimal;
 
public class Main {
 
    public static void main(String[] args) {
 
        BigDecimal zero = new BigDecimal("0");
        BigDecimal one = new BigDecimal("1");
 
        System.out.println(zero.compareTo(one));
        System.out.println(one.compareTo(zero));
        System.out.println(zero.compareTo(zero));
    }
}

実行結果:

-1
1
0

compareToメソッドでBigDecimalの値を比較する場合の戻り値は次の通りです。

  • メソッドの呼び出し元の値が、引数の値より小さい場合は”-1”
  • メソッドの呼び出し元の値が、引数の値より大きい場合は”1”
  • メソッドの呼び出し元の値が、引数の値と同じ場合は”0”

BigDecimalの値を比較する方法についてはこちらで詳しく解説しているので、ぜひ確認してください!

BigDecimalの型変換

BigDecimal型の値とString型やInt型などの数値型の値を型変換する方法についてご紹介します。

String型との相互変換

BigDecimal型とString型との型変換についてご紹介します。

BigDecimal型からString型への変換

BigDecimal型からString型へ変換するには、toStringメソッドを使用します。サンプルコードで確認しましょう。

import java.math.BigDecimal;

public class Main {
 
    public static void main(String[] args) {
        BigDecimal bd = new BigDecimal("123.456");
        String str = bd.toString();
        System.out.println(str);    
    }

}

実行結果:

123.456

String型からBigDecimal型への変換

String型からBigDecimal型への変換する方法は、すでにご紹介済みですね。例えば以下のように記述します。

BigDecimal bdNum1 = new BigDecimal("1");

int型との相互変換

BigDecimal型とint型などの数値型との型変換についてご紹介します。

BigDecimal型から数値型への変換

BigDecimal型からint型などの数値型へ変換するには、intValue、doubleValueメソッドなどを使用します。サンプルコードで確認しましょう。

import java.math.BigDecimal;

public class Main {
 
    public static void main(String[] args) {
        BigDecimal bd1 = new BigDecimal("123");
        BigDecimal bd2 = new BigDecimal("444.444");
        
        int num1 = bd1.intValue();
        double num2 = bd2.doubleValue();
        
        System.out.println(num1);
        System.out.println(num2);
    }

}

実行結果:

123
444.444

なお、short型への変換の場合はshortValueメソッドを、long型への変換の場合はlongValueメソッドを、float型への変換の場合はfloatValueメソッドを使用します。

数値型からBigDecimal型への変換

int型などの数値型からBigDecimal型への変換には、valueOfメソッドを使用します。こちらもすでにサンプルコードでご紹介済みですね。

例えば以下のように記述します。

BigDecimal ten = BigDecimal.valueOf(10);

まとめ

いかがでしたか?

今回はBigDecimalクラスの使い方について解説しました。BigDecimalクラスを使うと正確に計算や、四捨五入などの丸め処理ができるので、ぜひ覚えてくださいね。

もし、BigDecimalクラスを使う方法を忘れてしまったらこの記事を確認してください!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次