大于或等于浮点数失败

时间:2017-01-17 07:00:35

标签: python floating-accuracy floating

我正在运行一个针对某些数据编写的小python测试并得到了一些奇怪的结果。把它归结为:

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

结果为“NO”

为什么0.40不是> = .40?

2 个答案:

答案 0 :(得分:3)

来自文档

  

表示错误是指一些(大多数,实际上)十进制的事实   分数不能完全表示为二元(基数2)分数。   这就是Python(或Perl,C,C ++,Java,Fortran,   和许多其他人)经常不会显示您的确切十进制数   预计有:

0.1 + 0.2
0.30000000000000004

答案 1 :(得分:2)

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应用程序。希望这有帮助