- 締切済み
Javaの計算結果がおかしい
javaの勉強をしていますが、以下のプログラム(double型の配列データを全件合計)を実行するとおかしな結果になります。 どなたか、理由をご教示願いただきたく。 package exec; public class Error { public static void main(String[] args) { double[] data = {12.3,12.2,12.3,13.0,12.8,13.0}; double total = 0.0; for (double dd : data){ total += dd; System.out.println(total); } } } 実行結果は、次のように正しくありません。 12.3 24.5 37.5 50.3 62.599999999999994 75.6 ちなみに、double[] data = {12.3,12.2,13.0,12.8,13.0,12.3}; のように2つめの12.3を最後にすると 12.3 24.5 37.5 50.3 63.3 75.6 と正しい集計をします。 環境はWindows7(64bit)、Eclipse 3.7(junoでも同じ結果)、JDK1.7 です。 以上、よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- 中村 拓男(@tknakamuri)
- ベストアンサー率35% (674/1896)
おなじみの話題ですが、浮動小数点に関して学習した方がよいでしょう。 正しい動作であり、Javaの問題ではありません。
- teketon
- ベストアンサー率65% (141/215)
尋ねている部分はどちらでしょうか? 実行した所、提示されている値ではなく、 > 12.3 > 24.5 > 37.5 > 50.3 > 62.599999999999994 > 75.6 下記のように表示されました。 > 12.3 > 24.5 > 36.8 > 49.8 > 62.599999999999994 > 75.6 たしかにおかしいですが、実行結果と例が違っていませんか? > 62.599999999999994 が62.56にならないということでしょうか? これは浮動小数点の計算による誤差です。 10進数と2進数での表記方法の違いにより生じます。 安易な解決方法としては、BigDecimalを使用してください。
お礼
お礼が遅くなり申し訳ありません。 ありがとうございます。 BigDecimalを使うということが初心者にはわかりませんでした。BigDecimalで当該数字をcharでセットする方法があることも知りました。
- asuncion
- ベストアンサー率33% (2127/6289)
浮動小数点数の誤差のせいではないかと思います。
お礼
お礼が遅くなり申し訳ありません。 有難うございます。 小数点を取り扱うときには、誤差に注意します。
お礼
ありがとうございます。 お礼が遅くなり申し訳ありません。 2進法の誤差と理解しました。