为什么这些浮标被评估为平等?

时间:2011-03-30 02:49:49

标签: python printing equivalent

在下面的代码中,如果x0 == x1和y0 == y1,那么它应该告诉我。在我正在使用的例子中,它们是。但是,Python只是说x值相等,而不是y。

以下是代码:

print "arc2x0 = ", arc2x0, ", arc2x1 = ", arc2x1
print "arc2y0 = ", arc2y0, ", arc2y1 = ", arc2y1

if arc2x0 == arc2x1:
    print "x0 == x1"
else:
    print "x0 != x1"

if arc2y0 == arc2y1:
    print "y0 == y1"
else:
    print "y0 != y1"

这是输出:

arc2x0 =  5 , arc2x1 =  5.0
arc2y0 =  -4.16026900507 , arc2y1 =  -4.16026900507
x0 == x1
y0 != y1

知道为什么y值测试相同吗?这些值以相同的方式计算。也许除了我所看到的不平等之外还有更多的精确度?有关如何调试此精度或任何其他想法的任何方法吗?

3 个答案:

答案 0 :(得分:5)

是的,除了你所看到的更精确之外。问题是==运算符通常不应该与浮点数一起使用。浮点数具有有限的精度并且累积舍入误差,并且由于不能精确地存储所有十进制值而不精确。 e.g。

>>> print '%.18f' % 0.1
0.100000000000000006

>>> 0.4 - 0.3 == 0.1
False

比较浮点数是否相等的最佳方法是比较它们是否几乎相等:

def nearly_equal(x, y, epsilon=1e-7):
    return abs(x - y) < epsilon

通过比较浮点数之间的差异是否小于epsilon值,这表示认为接近的距离足够接近等于。

您始终可以使用decimal.Decimal类型来避免这些问题。

答案 1 :(得分:1)

请参阅here

答案 2 :(得分:1)

这是由于浮点的工作原理,你应该手动截断数字以强制精确到你想要的数字:

a=-4.16026900507

figures =9
a=round(a*(10**figures))/(10**figures) # truncates the digits
print a

但我认为最好的方法是使用十进制:

from decimal import *
a = Decimal ('your number as a string')