doubleの演算による「丸め誤差」を避けるためのテク
プログラム: 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); } }