我正在運行一個針對某些數據編寫的小型python測試,並且得到了一些奇怪的結果。煮下來到這一點:大於或等於浮動失敗
priceDiff = 219.92 - 219.52
if(priceDiff >= .40):
print "YES"
else:
print "NO"
結果是 「否」
爲什麼不是0.40> = 0.40?
我正在運行一個針對某些數據編寫的小型python測試,並且得到了一些奇怪的結果。煮下來到這一點:大於或等於浮動失敗
priceDiff = 219.92 - 219.52
if(priceDiff >= .40):
print "YES"
else:
print "NO"
結果是 「否」
爲什麼不是0.40> = 0.40?
python提供受控環境以「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應用程序的可讀性和執行的interms。希望這有助於
從文檔
表示錯誤是指這樣的事實,一些(最多,實際上)十進制 餾分不能被精確表示爲二進制(基數爲2)的級分。 這是主要的原因的Python(或Perl,C,C++,Java和Fortran語言, 和許多其他人)往往不會顯示確切的十進制數你 預計:
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