バナー画像

Javaには数値を扱う型として「float」や「double」などもありますが、小数点以下の正確な値の計算を行うためには「BigDecimal」を利用する必要があります。

本記事では、JavaにおけるBigDecimalの基本的な使い方をご紹介していきたいと思います。

JavaのBigDecimalとは

ポテパンダの一言メモ

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」を混同していた方は、ぜひこの機会にプログラムで不具合を生まないよう、しっかりとそれぞれ使い分けられるように理解しておきましょう。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。