21

重複の可能性:
浮動小数点数を使用した Python の丸めエラー
python maths is wrong

Python で減算 1 - 0.8 を正しく実行して代入することができません。間違った答え、0.19999999999999996 が出続けます。

私は少し調べました:

sq = {}
sub = {}
for i in range(1000):
    sq[str(i/1000.)+'**2']=((i/1000.)**2)
    sub['1-'+str(i/1000.)]=(1.0-(i/1000.))

そして、このエラーは、0 から 1 の間の小数第 3 位までの浮動小数点数のややランダムなグループで発生することを発見しました。これらのフロートを 2 乗するときにも同様のエラーが発生しますが、サブセットが異なります。

これについての説明と、Python に正しい算術演算をさせる方法を期待しています。Usinground(x,3)は私が現在使用している回避策ですが、エレガントではありません。

ありがとう!

これは、私の Python 2.7.3 シェルでのセッションです。

*** Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32. ***
*** Remote Python engine  is active ***
>>> 1-0.8
0.19999999999999996
>>> print 1-0.8
0.2
>>> a = 1-0.8
>>> a
0.19999999999999996
>>> print a
0.2
>>> a = 0.2
>>> print a
0.2
>>> a
0.2
>>> 

以下は、いくつかのオンライン インタープリターに挿入したコードです。

def doit():
    d = {'a':1-0.8}
    return d

print doit()

そして出力:

{'a': 0.19999999999999996}
4

3 に答える 3

17

Decimalこのためだけに設計されたものを使用してください:

>>> from decimal import Decimal, getcontext
>>> Decimal(1) - Decimal(0.8)
Decimal('0.1999999999999999555910790150')
>>> getcontext().prec = 3
>>> Decimal(1) - Decimal(0.8)
Decimal('0.200')
>>> float(Decimal(1) - Decimal(0.8))
0.2
于 2013-01-02T11:11:00.790 に答える
12

浮動小数点数は期待どおりに機能しません。

まず、浮動小数点ガイドをお読みください。簡単に言うと、コンピューターは浮動小数点数を 2 進数として表現しますが、正確な小数を 2 進数として格納することはできないことが判明しました (紙の上で試してみて、その理由を確認してください)。実際には、0.19999999999999996 は 0.2 に「十分近い」です。0.2 として出力したい場合は、次のようにします。

print "%0.1f" % floating_point_value

したがって、表示されているのはエラーではありません。これは予想される動作です。

于 2013-01-02T10:24:54.810 に答える
2

Python は浮動小数点数を「ビット」で格納しますが、浮動小数点数の中には正確に表現できないものもあります。これがあなたがここで抱えている問題です。1/3これは、小数点以下の桁数が限られている 10 進数で完全に正確に書き込もうとするようなものです。

于 2013-01-02T10:25:42.497 に答える