Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么不';这些浮点数是否相等?_Python_Printing_Equivalent - Fatal编程技术网

Python 为什么不';这些浮点数是否相等?

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

在下面的代码中,如果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值是相等的吗?这些值的计算方法相同。也许有比我所看到的更精确的不平等?任何打印该精度的方法或任何其他调试方法?

请参见。

请参见。

这是由于浮点运算的原理,您应该手动截断数字,以强制将精度设置为所需的数字:

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有这个,反正我编辑了答案