Python 为什么不';这些浮点数是否相等?
在下面的代码中,如果x0==x1和y0==y1,那么它应该这样告诉我。在我使用的示例中,它们是。然而,Python只是说x值相等,而不是y值相等 代码如下:Python 为什么不';这些浮点数是否相等?,python,printing,equivalent,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
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值是相等的吗?这些值的计算方法相同。也许有比我所看到的更精确的不平等?任何打印该精度的方法或任何其他调试方法?请参见。请参见。这是由于浮点运算的原理,您应该手动截断数字,以强制将精度设置为所需的数字:
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')
这是由于浮点数的工作原理,您应该手动截断数字以强制精度达到所需的数字:
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')
是的,比你看到的更精确。问题是==运算符通常不应与浮点一起使用。浮点数具有有限的精度和累积舍入误差,以及由于无法精确存储所有十进制值而导致的不精确性。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
def几乎相等(x,y,ε=1e-7):
返回abs(x-y)
通过比较浮点数之间的差值是否小于epsilon值,该值表示接近程度被视为足够接近而相等
您可以始终使用decimal.decimal类型来避免这些问题。是的,精度比您看到的要高。问题是==运算符通常不应与浮点一起使用。浮点数具有有限的精度和累积舍入误差,以及由于无法精确存储所有十进制值而导致的不精确性。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
def几乎相等(x,y,ε=1e-7):
返回abs(x-y)
通过比较浮点数之间的差值是否小于epsilon值,该值表示接近程度被视为足够接近而相等
您可以始终使用decimal.decimal类型来避免这些问题。
打印“arc2y0=%r,arc2y1=%r”%(arc2y0,arc2y1)
您将看到您拥有的数字并不完全相等打印“arc2y0=%r,arc2y1=%r”%(arc2y0,arc2y1)
您将看到,您拥有的数字并不完全相等。在比较浮点时,无论精度如何,您都会遇到类似的问题。如果你鼓吹使用numpy,因为它有更高精度的浮点数,那就错了。@Paddy3118我刚刚检查过,你是对的,我找不到我读到的numpy有这个问题的地方,反正我编辑了答案。你在比较浮点数时,无论精度如何,都会遇到类似的问题。如果你鼓吹使用numpy,因为它有更高精度的浮点数,那就错了。@Paddy3118我刚刚检查过,你是对的,我找不到我在哪里读到的numpy有这个,反正我编辑了答案