2017-01-17 89 views
0

我正在運行一個針對某些數據編寫的小型python測試,並且得到了一些奇怪的結果。煮下來到這一點:大於或等於浮動失敗

priceDiff = 219.92 - 219.52 
if(priceDiff >= .40): 
    print "YES" 
else: 
    print "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提供受控環境以「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。希望這有助於

3

從文檔

表示錯誤是指這樣的事實,一些(最多,實際上)十進制 餾分不能被精確表示爲二進制(基數爲2)的級分。 這是主要的原因的Python(或Perl,C,C++,Java和Fortran語言, 和許多其他人)往往不會顯示確切的十進制數你 預計:

0.1 + 0.2 
0.30000000000000004