Skip to main content
 首页 » 编程设计

python之为什么不将这些 float 评估为相等

2025年05月04日13unruledboy

在下面的代码中,如果 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 值被测试为相等吗?这些值以相同的方式计算。也许除了我所看到的不平等之外,还有更多的精确度?有什么方法可以打印该精度或关于如何调试它的任何其他想法?

请您参考如下方法:

是的,比您所看到的更精确。问题是 == 运算符通常不应与 float 一起使用。 float 具有有限的精度和累积的舍入误差,以及无法精确存储所有小数值的不精确性。例如

>>> print '%.18f' % 0.1 
0.100000000000000006 
 
>>> 0.4 - 0.3 == 0.1 
False 

比较 float 是否相等的最好方法是比较它们是否几乎相等:

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

通过比较 float 之间的差异是否小于 epsilon 值,这表明接近程度被认为足够接近以至于相等。

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