私は小さなPythonテストを実行していましたが、私はいくつかのデータに対して書いて、奇妙な結果を得ました。これにそれを煮詰め:浮動小数点数以上が失敗しました
priceDiff = 219.92 - 219.52
if(priceDiff >= .40):
print "YES"
else:
print "NO"
結果が "NO"
なぜ0.40ない> = 0.40であるのですか?ドキュメントから
私は小さなPythonテストを実行していましたが、私はいくつかのデータに対して書いて、奇妙な結果を得ました。これにそれを煮詰め:浮動小数点数以上が失敗しました
priceDiff = 219.92 - 219.52
if(priceDiff >= .40):
print "YES"
else:
print "NO"
結果が "NO"
なぜ0.40ない> = 0.40であるのですか?ドキュメントから
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優れています。これがうまくいきたいです
表現エラーは、いくつかの(最も実際)小数 画分をバイナリ(ベース2)の画分として正確に表現できないことを意味します。
0.1 + 0.2
0.30000000000000004
'print(219.92 - 219.52)'を試してください。あなたは驚くでしょう。 – DyZ
私はfloat.hex(priceDiff)とfloat.hex(.40)を試してみました。私は浮動小数点数を論じなければならなかったので、しばらくしてきましたが、私はちょうどこれがうまくいくと仮定しました(私は単に価格を含むデータを比較していたので) – yellowandy
あなたはそれほど遠くに行く必要はありません。 'priceDiff'は0.39999999999997726で、これは0.4未満です。 – DyZ