Python浮动平等怪异

时间:2012-05-12 03:28:38

标签: python floating-point equality

今晚看到Python的一些意想不到的行为。为什么以下打印出“不相等”?!

num = 1.00
num -= .95
nickel = .05

if nickel != num:
    print 'not equal'
else:
    print 'equal' 

3 个答案:

答案 0 :(得分:6)

What every computer scientist should know about floating point arithmetic

>>> num = 1.00
>>> num
1.0
>>> num -= 0.95
>>> num
0.050000000000000044
>>> nickel = .05
>>> nickel
0.05

答案 1 :(得分:2)

您可能会发现decimal模块很有用。

>>> TWOPLACES = Decimal(10) ** -2
>>> Decimal(1).quantize(TWOPLACES)-Decimal(0.95).quantize(TWOPLACES) == Decimal(0.05).quantize(TWOPLACES)
True

或者,或者:

import decimal
decimal.getcontext().prec = 2
decimal.Decimal(1.00) - decimal.Decimal(0.95)

我从你正在考虑金钱的nickel变量的命名中推断出来。显然,浮点数是错误的类型。

答案 2 :(得分:0)

这是计算机常见的浮点问题。它与计算机如何存储浮点数有关。我建议快速阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic