比较python中的'float'和'float64'

比较python中的'float'和'float64',python,numpy,Python,Numpy,我必须比较两个数字。其中一个来自regulat python代码,另一个来自numpy。调试器显示它们具有相同的值“29.0”,但第一种类型为float,第二种类型为float64,因此a==b和a-b==0为False。我该怎么处理呢?有没有办法去 默认情况下,强制常规python变量为float64或numpy usefloat 更新:最后,所有这些值都来自编写29.0的同一个文件,因此我认为数值之间没有差异。在任何编程语言中,都不应该将浮点值与相等值进行比较,因为您永远不知道它们完全相等。

我必须比较两个数字。其中一个来自regulat python代码,另一个来自numpy。调试器显示它们具有相同的值“29.0”,但第一种类型为
float
,第二种类型为
float64
,因此
a==b
a-b==0
False
。我该怎么处理呢?有没有办法去 默认情况下,强制常规python变量为
float64
或numpy use
float


更新:最后,所有这些值都来自编写
29.0
的同一个文件,因此我认为数值之间没有差异。

在任何编程语言中,都不应该将浮点值与相等值进行比较,因为您永远不知道它们完全相等。相反,您应该测试它们的差异是否小于公差:

if abs(a - b) < 1e-10
如果abs(a-b)<1e-10
因此,这个问题与
float
float64
之间的差异无关(Python会自动转换它们),而是与比较float是否相等这一基本问题有关


另请参见

如果您正在使用numpy,执行Antonis建议的操作的最佳方法是使用函数
np.allclose(a,b)
。您还可以指定公差(
1e-10
从上面开始)。

通常,将任意两个浮点数与
a==b
a-b==0
进行比较是一个坏主意,因为精度错误。试着做类似于abs(a-b)<1e-8之类的事情。浮点表示和算术是不精确的(尾数和截断pb)。设置最大差值的ε(通常为10e-10)。虽然通常这些注释都是正确的,但如果值
29.0
来自一个可能是ASCII格式的文件,我无法想象该值会出现精度错误。29.0可以精确表示。@glglgl不一定。在二进制中,数字表示为c×2ⁿ. 如果c=29,n=0,那么,是的,它可以精确表示;但在一些浮点表示中,c≤0.5,在这种情况下可能无法准确表示。在我的系统上,float(29.0)=float64(29.0),但这不能保证。@glglgl此外,OP说调试器说该值是29.0;他没有说价值从哪里来。它很容易成为一个计算值,据我们所知,它可能是29.00000000000001。谢谢。看起来我需要更多的时间(=)所以我忘记了这个基本的东西。实际上,在使用符号数学计算的语言中,你可以比较数字和等式。出于某种原因,
np.isclose(a,b)
np.abs(a-b)<1e-10
使用更多的内存。