Javaで小数点以下の計算(浮動小数点数の計算)を行う場合、注意すべき点は多くあります。正確な金額や割合などの計算では誤差や丸めの問題が起こりやすく、特に以下の点に気をつける必要があります。
✅ 小数点計算で気をつけること1. 浮動小数点数(float, double)は誤差が出るSystem.out.println(0.1 + 0.2); // → 0.30000000000000004
2. 比較が正しく行えない可能性double a = 0.1 + 0.2;if (a == 0.3) { System.out.println("等しい");} else { System.out.println("等しくない"); // ← こっちになる}
✅ 対策:目的によって使い分ける
【1】BigDecimalを使う(精度が重要な場合)✅ 金額・精密な計算が必要なときはこれ一択!import java.math.BigDecimal;BigDecimal a = new BigDecimal("0.1");BigDecimal b = new BigDecimal("0.2");BigDecimal c = a.add(b);System.out.println(c); // → 0.3
◾ 注意点new BigDecimal("0.1") ← 文字列で渡すこと(new BigDecimal(0.1) は誤差を引き継ぐ)
計算時には .add(), .subtract(), .multiply(), .divide() を使う divide() には丸めモードが必要な場合がある
BigDecimal a = new BigDecimal("1");BigDecimal b = new BigDecimal("3");BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP); // → 0.33
【2】doubleの誤差対策(精度がそこまで重要でない場合)◾ 許容誤差(イプシロン)を使って比較double a = 0.1 + 0.2;double b = 0.3;if (Math.abs(a - b) < 0.00001) { System.out.println("ほぼ等しい");}
【3】必要に応じて桁数・丸めの制御◾ DecimalFormat や String.format() で表示上の整形もできるSystem.out.println(String.format("%.2f", 1.23456)); // → 1.23
✅ まとめ| 問題 | 内容 | 対策 |
|---|
| 誤差が出る | double や float で 0.1 などが正確に表現できない | BigDecimal を使用する | | 比較が正しくない | == で比較できない | Math.abs(a - b) < ε で比較 | | 表示の丸め | 小数点桁数の整形が必要 | BigDecimal.setScale() や String.format() |
◾ オススメの使い分け指針:
|
この記事へのコメント