ほぼ中立ブログ

少しだけ趣味に偏った雑記ブログ

ループカウンタに小数を使ったらハマった(Python)

入門書で読んだきり忘れていた問題に、この度出くわしたので備忘録を兼ねてまとめておこうと思います。

以下のようなPythonのコードを書いていました。

start, end, delta = 0.1, 0.3, 0.1
i = start
while i <= end:
    i += delta
    print(i)

自分としては3回値が表示されるつもりだったんですが実際に実行してみると次のように出力されます。

0.2
0.30000000000000004

2回しか表示されない上に、0.3が表示されるはずの2回めのループの値がおかしいですね。限りなく0.3に近いけれど、少しだけ0.3より大きい値になってしまっています。これにより3回目のループが実行されないようですね。

調べたところ、このような場合は正確な計算が行えるよう、decimalモジュールを利用すれば良いようです。

decimalモジュールを使って上のコードを書き直したものが次の通りです。

from decimal import Decimal

start, end, delta = Decimal('0.1'), Decimal('0.3'), Decimal('0.1')
i =  start
while i <= end:
    i += delta
    print(i)

これを実行すると以下のように出力されます。

0.2
0.3
0.4

今度は意図したとおりループ部分が3回実行されました。表示される値もピッタリ0.2, 0.3, 0.4で端数もありません。

最後までお読みいただきありがとうございました。