JavaでBigDecimalを使う方法は?算術メソッド・丸め・比較・変換

- システム
エンジニア - JavaのBigDecimalはどのように使用するのでしょうか。
- プロジェクト
マネージャー - 誤差なく正確に計算するために使用します。実際のソースコードを見ながら学んでいきましょう。
JavaでBigDecimalを使う方法とは?
今回は、JavaでBigDecimalを使う方法について説明します。Javaには誤差なく正確に計算するためのBigDecimalクラスがあります。
JavaのBigDecimalオブジェクトの生成方法、算術メソッド、丸め、比較、変換などについて紹介します。
JavaでBigDecimalを使う方法に興味のある方はぜひご覧ください。
JavaのBigDecimalオブジェクトの生成方法
JavaのBigDecimalオブジェクトは以下の方法で生成します。
1
2
3
4
5
6
7
8
|
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) throws Exception {
BigDecimal value1 = BigDecimal.valueOf(0.9); // 数値から生成
BigDecimal value2 = new BigDecimal(""1.0""); // 文字列から生成
}
}
|
例えば、JavaのBigDecimalクラスを使用した減算と使用しない減算では、結果が違うことがあります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) throws Exception {
BigDecimal val1 = new BigDecimal(""1"");
BigDecimal val2 = new BigDecimal(""0.9"");
// 減算
BigDecimal result = val1.subtract(val2);
// JavaのBigDecimalクラスを使用した減算と使用しない減算では結果が違う
System.out.println(result);
System.out.println(1 - 0.9);
}
}
|
実行結果は以下のようになります。
1
2
|
0.1
0.09999999999999998
|
このように、Javaでは誤差なく正確に計算するためにBigDecimalクラスを利用します。
JavaのBigDecimal算術メソッド
JavaのBigDecimalクラスには算術メソッドが用意されています。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) throws Exception {
BigDecimal val1 = new BigDecimal(""123.11"");
BigDecimal val2 = new BigDecimal(""12.11"");
BigDecimal result1 = val1.add(val2);
BigDecimal result2 = val1.subtract(val2);
BigDecimal result3 = val1.multiply(val2);
BigDecimal result4 = val1.divide(val2, 1, BigDecimal.ROUND_HALF_UP);
BigDecimal result5 = val1.remainder(val2);
System.out.println(""加算:"" + val1 + "".add("" + val2 + "") = "" + result1);
System.out.println(""減算:"" + val1 + "".subtract("" + val2 + "") = "" + result2);
System.out.println(""乗算:"" + val1 + "".multiply("" + val2 + "") = "" + result3);
System.out.println(""除算:"" + val1 + "".divide("" + val2 + "") = "" + result4);
System.out.println(""剰余:"" + val1 + "".remainder("" + val2 + "") = "" + result5);
}
}
|
実行結果は以下のようになります。
1
2
3
4
5
|
加算:123.11.add(12.11) = 135.22
減算:123.11.subtract(12.11) = 111.00
乗算:123.11.multiply(12.11) = 1490.8621
除算:123.11.divide(12.11) = 10.2
剰余:123.11.remainder(12.11) = 2.01
|
このように、JavaのBigDecimalクラスには算術メソッドが用意されています。
丸め(切り捨て/切り上げ/四捨五入)
JavaのBigDecimalクラスには丸め(切り捨て/切り上げ/四捨五入)のためのメソッドが用意されています。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) throws Exception {
BigDecimal value = new BigDecimal(""400.545"");
// RoundingMode.FLOOR(切り捨て)。以下の場合、小数点第1位で切り捨て
BigDecimal result1 = value.setScale(0, RoundingMode.FLOOR);
// RoundingMode.CEILING(切り上げ)。以下の場合、小数点第2位で切り上げ
BigDecimal result2 = value.setScale(1, RoundingMode.CEILING);
// RoundingMode.HALF_UP(四捨五入)。以下の場合、小数点第3位で四捨五入
BigDecimal result3 = value.setScale(2, RoundingMode.HALF_UP);
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
}
}
|
実行結果は以下のようになります。
1
2
3
|
400
400.6
400.55
|
Javaでは、setScaleメソッドで桁と丸めモード(切り捨て/切り上げ/四捨五入)を指定できます。
このように、JavaのBigDecimalクラスには丸め(切り捨て/切り上げ/四捨五入)のためのメソッドが用意されています。
比較
Javaでは、compareToメソッドでBigDecimal型の比較ができます。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) throws Exception {
BigDecimal val1 = new BigDecimal(""0"");
BigDecimal val2 = new BigDecimal(""1.0"");
BigDecimal val3 = new BigDecimal(""1.00"");
// compareToメソッドで比較
System.out.println(val1 + "".compareTo("" + val2 + "") : "" + val1.compareTo(val2));
System.out.println(val2 + "".compareTo("" + val3 + "") : "" + val2.compareTo(val3));
System.out.println(val3 + "".compareTo("" + val1 + "") : "" + val3.compareTo(val1));
// equalsメソッドで比較
System.out.println(val2 + "".equals("" + val3 + "") : "" + val2.equals(val3));
}
}
|
実行結果は以下のようになります。
1
2
3
4
|
0.compareTo(1.0) : -1
1.0.compareTo(1.00) : 0
1.00.compareTo(0) : 1
1.0.equals(1.00) : false
|
Javaでは、BigDecimalの小数点以下の精度が違う(1.0と1.00の)場合、compareToメソッドは等しいと判断しますが、equalsメソッドは不一致と判断します。
用途に応じて使い分けてください。
- システム
エンジニア - JavaでBigDecimalクラスを使用すると、減算や丸めによる計算結果の誤差を防いでくれるのですね。
- プロジェクト
マネージャー - 誤差なく正確に計算するために、BigDecimalクラスを実際に使用してみましょう。
まとめ
JavaでBigDecimalを使う方法について説明しました。Javaには誤差なく正確に計算するためのBigDecimalクラスがあります。JavaのBigDecimalオブジェクトの生成方法、算術メソッド、丸め、比較、変換などについて紹介しました。
ぜひご自身でJavaソースコードを書いて、理解を深めてください。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Java新着案件New Job
-
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅) -
販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅) -
生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅) -
社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅) -
金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅) -
大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)