2017-01-17 3 views
0

私は小さなPythonテストを実行していましたが、私はいくつかのデータに対して書いて、奇妙な結果を得ました。これにそれを煮詰め:浮動小数点数以上が失敗しました

priceDiff = 219.92 - 219.52 
if(priceDiff >= .40): 
    print "YES" 
else: 
    print "NO" 

結果が "NO"

なぜ0.40ない> = 0.40であるのですか?ドキュメントから

+1

'print(219.92 - 219.52)'を試してください。あなたは驚くでしょう。 – DyZ

+0

私はfloat.hex(priceDiff)とfloat.hex(.40)を試してみました。私は浮動小数点数を論じなければならなかったので、しばらくしてきましたが、私はちょうどこれがうまくいくと仮定しました(私は単に価格を含むデータを比較していたので) – yellowandy

+0

あなたはそれほど遠くに行く必要はありません。 'priceDiff'は0.39999999999997726で、これは0.4未満です。 – DyZ

答えて

1

Pythonが制御されています: これは、あなたが期待する パイソン(やPerl、C、C++、Javaの、Fortranの、 および多くの他)は、多くの場合、正確な進数が表示されませんなぜチーフ理由があります「Decimal」の形式で浮動小数点数を扱う環境です。さまざまな戦略と一緒に丸めの量で丸めを制御/微調整するための複数のオプションが用意されています(https://docs.python.org/3.5/library/decimal.html#rounding-modes)。

from decimal import Decimal, ROUND_HALF_EVEN 
a = Decimal(219.92).quantize(Decimal('.01'), rounding=ROUND_HALF_EVEN) 
b = Decimal(219.52).quantize(Decimal('.01'), rounding=ROUND_HALF_EVEN) 
priceDiff = a - b 
cmp = Decimal(0.40).quantize(Decimal('.01'), rounding=ROUND_HALF_EVEN) 

if priceDiff.compare(cmp) >= 0: 
    print "YES" 
else: 
    print "NO" 

print(d) 
print(d2) 
print(priceDiff) 
print(cmp) 

私見これは精度敏感w.r.tアプリケーションです計算の読みやすさとimplementaionのinterms優れています。これがうまくいきたいです

3

表現エラーは、いくつかの(最も実際)小数 画分をバイナリ(ベース2)の画分として正確に表現できないことを意味します。

0.1 + 0.2 
0.30000000000000004 
関連する問題