Javaで小数点以下の計算をする際に気をつけること

emile-perron-xrVDYZRGdw4-unsplash.jpg

質問

Javaで小数点以下の計算をする際に気をつけることと対策を教えてください


解答

Javaで小数点以下の計算(浮動小数点数の計算)を行う場合、注意すべき点は多くあります。正確な金額や割合などの計算では誤差丸めの問題が起こりやすく、特に以下の点に気をつける必要があります。


✅ 小数点計算で気をつけること

1. 浮動小数点数(float, double)は誤差が出る

System.out.println(0.1 + 0.2); // → 0.30000000000000004
  • floatdouble2進数で正確に表現できない10進数がある

  • 計算結果に わずかな誤差が蓄積されていく


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("ほぼ等しい");}
  • 誤差が許容範囲内なら OK と判断する方法


【3】必要に応じて桁数・丸めの制御

DecimalFormatString.format() で表示上の整形もできる

System.out.println(String.format("%.2f", 1.23456)); // → 1.23

✅ まとめ

問題内容対策
誤差が出るdoublefloat で 0.1 などが正確に表現できないBigDecimal を使用する
比較が正しくない== で比較できないMath.abs(a - b) < ε で比較
表示の丸め小数点桁数の整形が必要BigDecimal.setScale()String.format()

◾ オススメの使い分け指針:

  • お金・金利・税率などの正確な計算BigDecimal

  • センサー値や画像処理などで多少の誤差が許容されるdouble(+誤差対策)










Cloud Native Java Designing Resilient Systems with Spring Boot, Spring Cloud, and Cloud Foundry【電子書籍】[ Josh Long ]

価格:3080円
(2025/6/10 11:49時点)
感想(0件)


プログラミングRust 第2版 [ Jim Blandy ]

価格:5280円
(2023/11/21 20:37時点)
感想(0件)


 



この記事へのコメント