0

次の点を考慮してください。

Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> x = 2.0
>>> print x < 2.0
False
>>> 
>>> x = 2.2
>>> x -= 0.2
>>> print x < 2.0
False
>>> 
>>> x = 2.4
>>> x -= 0.2
>>> x -= 0.2
>>> print x < 2.0
True
>>> print x
2.0

x が 2.4 から 2.0 に減少すると、最後から 2 番目のステートメントが True を出力するのはなぜですか? 何が欠けていますか?

4

2 に答える 2

7

2.4 も 0.2 も正確なfloat表現を持たないという事実を見逃しています。

In [31]: '%.20f' % 2.4
Out[31]: '2.39999999999999991118'

In [32]: '%.20f' % 0.2
Out[32]: '0.20000000000000001110'

したがって:

In [33]: '%.20f' % (2.4 - 0.2 - 0.2)
Out[33]: '1.99999999999999977796'

これは 2.0 未満です。

これについては、チュートリアルで詳しく説明します (ただし、この問題は決して Python 固有のものではなく、浮動小数点数の一般的な制限であることは注目に値します)。

于 2013-03-05T07:43:12.403 に答える
3

コメントが言及しているように、一般に浮動小数点数は固定小数点数と比較して不正確です。これについては、数値をより正確に出力するよう Python に要求することで、もう少しヒントを得ることができます。

>>> '%0.20g' % (2.4 - 0.2 - 0.2)
'1.999999999999999778'

ご覧のとおり、この数は 2 未満です。

固定精度の数値データ型を使用する場合、Python にはDecimalデータ型が用意されています。

>>> from decimal import Decimal
>>> Decimal('2.4') - Decimal('0.2') - Decimal('0.2')
Decimal('2.0')
>>> Decimal('2.0') < 2.0
False

ただし、10 進演算は組み込みの浮動小数点演算よりも遅くなるため、追加の精度が必要な場合 (金融計算など) にのみ使用する必要があることに注意してください。

于 2013-03-05T07:49:37.130 に答える