プログラミング勉強日記
2020年11月26日
BigDecimalクラスを使うことで四捨五入や切り捨・切り上げはできるけど、これによって誤差(丸め誤差)が生じてしまうので、その解決方法も一緒に紹介する。
BigDecimalクラスとは
小数点以下の値に誤差が出ないよう正確に計算するために使う。小数点以下の四捨五入や切り捨て・切り上げといった処理を行うことができる。BigDecimalクラスを使用するためにはjava.math.BigDecimal
パッケージをインポートする必要がある。
BigDecimalクラスのsetScale()メソッドを使用することで、任意の桁数で切り上げ処理を行うことができ、基本的な書き方は下記のようになる。
構文
setScale(桁数,BigDecimal.ROUND_UP).doubleValue()
誤差を発生しないために
BigDecimalクラスのコンストラクタの引数には浮動小数点型と文字列型どちらも指定することができるが、正確な値を扱うためには文字列型で定義する。引数に浮動小数点型を使用すると誤差が発生する可能性があるからだ。
サンプルコード
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
// 引数にdouble型(浮動小数点型)で指定
BigDecimal bd1 = new BigDecimal(0.6);
// 引数にString型(文字列型)で指定
BigDecimal bd2 = new BigDecimal("0.6");
System.out.println(bd1);
System.out.println(bd2);
}
}
実行結果
0.59999999999999997779553950749686919152736663818359375
0.6
どうしても最初にdouble型で定義したい場合は数値をString型に定義しなおす必要がある。
サンプルコード
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
double number = 0.5925;
// 数値を文字列に変換する
BigDecimal num = new BigDecimal(String.valueOf(number));
//小数第一位で切り上げ
double num0 = num.setScale(0,BigDecimal.ROUND_UP).doubleValue();
//小数第二位で切り上げ
double num1 = num.setScale(1,BigDecimal.ROUND_UP).doubleValue();
//小数第三位で切り上げ
double num2 = num.setScale(2,BigDecimal.ROUND_UP).doubleValue();
System.out.println("小数第一位で切り上げ:" + num0);
System.out.println("小数第二位で切り上げ:" + num1);
System.out.println("小数第三位で切り上げ:" + num2);
}
}
実行結果
小数第一位で切り上げ:1.0
小数第二位で切り上げ:0.6
小数第三位で切り上げ:0.6