読者です 読者をやめる 読者になる 読者になる

doubleの演算による「丸め誤差」を避けるためのテク

java
プログラム:
public static void main(String[] args) {
  for (double i = -3; i <= 3; i += 0.10) {
    System.out.println(i);
  }
}

実行結果:
-3.0
-2.9
-2.8
-2.6999999999999997
-2.5999999999999996
-2.4999999999999996
...

望んでいる結果:
-3.0
-2.9
-2.8
-2.7
...

望んだ結果にならない理由がわからなかったので、2ちゃんのスレッドで質問しようかなとレスを考えているうちに
「あぁ、これって浮動小数点数が云々でおかしな値になるんじゃなかったっけか」
と思い出し、ぐぐったらその通りだった。
http://javafaq.jp/S029.html

ほかのサイトも見てみると、こういうときは以下のように整数にしてから計算し、また元の少数桁に戻すテクが使われているらしい。java.Math.BigDecimalを使う方法もあるけど、それほど厳密な計算でもないし、処理時間が増えても困るので以下のようにする。

public static void main(String[] args) {
  double x = 0.0;
  for (int i = -300; i <= 300; i ++) {
    x = i / 100;
    System.out.println(x);
  }
}