• 締切済み

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 です。 以上、よろしくお願いいたします。

みんなの回答

回答No.3

おなじみの話題ですが、浮動小数点に関して学習した方がよいでしょう。 正しい動作であり、Javaの問題ではありません。

noname#176432
質問者

お礼

ありがとうございます。 お礼が遅くなり申し訳ありません。 2進法の誤差と理解しました。

  • teketon
  • ベストアンサー率65% (141/215)
回答No.2

尋ねている部分はどちらでしょうか? 実行した所、提示されている値ではなく、 > 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を使用してください。

noname#176432
質問者

お礼

お礼が遅くなり申し訳ありません。 ありがとうございます。 BigDecimalを使うということが初心者にはわかりませんでした。BigDecimalで当該数字をcharでセットする方法があることも知りました。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

浮動小数点数の誤差のせいではないかと思います。

noname#176432
質問者

お礼

お礼が遅くなり申し訳ありません。 有難うございます。 小数点を取り扱うときには、誤差に注意します。

関連するQ&A

専門家に質問してみよう