Pythonでの小数点の表示がおかしい

pythonで小数点の計算をしていると・・・

Pythonで小数点の計算をするとおかしなことが起こります。

print(0.1)
print(0.1+0.1)
print(0.1+0.1+0.1)
0.1
0.2
0.30000000000000004

0.1を2回までは良いですが、3回足し合わせると妙なことが起こります。

print(0.1*3)
print(0.1+0.1+0.1 == 0.3)
3倍しても結果は同じ、0.1を3つ足し合わせると0.3とは違うといわれてしまいます。
print(format(0.1, '.100f'))

format関数を使って100桁まで表示すると次のようになります。

0.1000000000000000055511151231257827021181583404541015625000000000000000000000000000000000000000000000

ある桁数まで表示して、それ以降は0が並びます。

len('1000000000000000055511151231257827021181583404541015625')
55

55桁まで計算されています。このように実際に計算に使われる桁数を有効桁数といいます。つまり有効桁数が55桁程度と考えられます。

理由は2進数だから・・・

0.1の計算がおかしいと思うのは、もともとコンピュータでは数字を2進数で扱っているからです。0.1を小数点であれわすとぴったりと割り切れません。人間にとっては0.1というのは切りの良い数字なのですが、2進数によるコンピュータにとっては中途半端な数字になるわけです。つたないプログラムですが0.1を2進数にすると次にようになります。ここでは100桁まで計算しています。

x = 0.1
for i in range(100):
    y = x//2
    if i == 1:
        print('0.', end='')
    if i > 1:
        print(int(y), end='')
    x = (x-y*2)*2
0.00011001100110011001100110011001100110011001100110011010000000000000000000000000000000000000000000
len('1100110011001100110011001100110011001100110011001101')
52

最初の1から最後の1までの桁数が52桁程度になります。このあたりわからないことがたくさん出てきます。また調べてみます。

この記事を書いた人

目次
閉じる