こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

投稿日時 - 2013-01-14 16:48:11

QNo.7891733

困ってます

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

おなじみの話題ですが、浮動小数点に関して学習した方がよいでしょう。

正しい動作であり、Javaの問題ではありません。

投稿日時 - 2013-01-15 00:04:58

お礼

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

投稿日時 - 2013-02-12 09:48:54

ANo.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を使用してください。

投稿日時 - 2013-01-14 17:20:58

お礼

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

投稿日時 - 2013-02-12 09:49:09

ANo.1

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

投稿日時 - 2013-01-14 16:56:42

お礼

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

投稿日時 - 2013-02-12 09:51:00

あなたにオススメの質問