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

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

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

この記事では、

  • BigDecimalとは
  • BigDecimalの使い方(足し算、引き算)
  • という基本的な内容から、

  • setScaleで桁数を指定して四捨五入
  • compareToでBigDecimalの値を比較
  • BigDecimalの型変換
  • などの応用的な使い方に関しても解説していきます。今回はこれらの方法を覚えるために、BigDecimalクラスのさまざまな使い方をわかりやすく解説します!

    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の計算をする方法についてはこちらで詳しく解説しているので、ぜひ確認してください!

    【Java入門】BigDecimalで小数点以下を誤差なく計算する方法
    更新日 : 2020年3月10日

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

    【解決Java】BigDecimalで四捨五入や切り捨ての丸め誤差を解決
    更新日 : 2019年4月5日

    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の値を比較する方法についてはこちらで詳しく解説しているので、ぜひ確認してください!

    【Java入門】BigDecimalの大小をcompareToで比較する方法
    更新日 : 2019年4月16日

    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クラスを使う方法を忘れてしまったらこの記事を確認してください!

    LINEで送る
    Pocket

    「プログラミング、右も左もわからない…」という方にオススメ

    当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

    その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

    侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

    cta_under_bnr

    「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

    書いた人

    中沢 丈

    中沢 丈

    フリーランスエンジニア。
    システム開発からコンテンツ作成まで幅広く対応します。

    連絡先はこちらです。
    [email protected]

    おすすめコンテンツ

    いまならレッスン期間が2週間延長!この秋、プログラミングを学ぼう

    転職成功で受講料0円!あなたもプログラミングを学んでエンジニアデビュー