こんにちは!エンジニアの中沢です。
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クラスを使う方法を忘れてしまったらこの記事を確認してください!