Python中请教为什么不相等

arr = np.array([3.12, 3.43, 3.77, 4.15, 4.57],dtype=np.float32)
In : arr[-1]
Out : 4.57
In : arr[-1] == 4.57
Out : False
Python中请教为什么不相等

22 回复

浮点数比较相等没意义


我无法理解你的问题

你猜 js 中 0.1+0.2 等于多少? 不是 0.3,而是 0.30000000000000004。所以楼上正解,浮点数不适合做等的比较。

arr = np.array([ 4.57],dtype=np.float64)
arr[0] == 4.57 # True

浮点精度损失

浮点数都是相减小于 0.000001 啥就算相等

永远不要用两个浮点数比较相等

这个问题,在 C 语言里不就应该知道了么,,,

难道不学 C 语言?好吧。。

浮点数比较一般都是两数相减,小于一个误差值就可以认为是相等了。。。

>>> ‘{0:.20f}’.format(np.float32(4.57))
‘4.57000017166137695312’
>>> ‘{0:.20f}’.format(np.float64(4.57))
‘4.57000000000000028422’
>>> ‘{0:.20f}’.format(4.57)
‘4.57000000000000028422’

<?php
$a=0.1;
$b=0.2;
$c=0.3;

var_dump(bccomp(bcadd($a, $b), $c));

?>

浮点数不能直接比较相等,只能|a-b|<c(一个小数)来判断

谢谢大家的帮助,还有一个问题 arr = np.array([3.12, 3.43, 3.77, 4.15, 4.57],dtype=np.float32),brr = np.array([2.56, 2.81, 3.09, 3.39, 4.57],dtype=np.float32),那么为什么 arr[-1] == brr[-1]却是正确的。

“浮点数都比较没有意义”的意思是,无论相等还是不等,都没有意义。

指向同一个地址吧

因为不管是 C 语言还是 Python 的浮点都是用 IEEE 754,这个没法表示准确的 10 进制小数。

你应该去查查浮点数在计算机里是怎么表示的。


>>> import numpy as np
>>> arr = np.array([3.12, 3.43, 3.77, 4.15, 4.57],dtype=np.float32)
>>> arr[-1]
4.57
>>> arr[-1]==4.57
False
>>> arr[-1]==np.float32(4.57)
True

很简单一个问题。一个是 numpy.float32 一个是内置 float 类型不一致 一个是 numpy 的数字类型 一个是 native type
你可以用 arr[-1].item() 转换 就可以和 native 的比对了 实际他转成 float 的数值并不是 4.57
>>> import numpy as np
>>> arr=np.array([3.12, 3.43, 3.77, 4.15, 4.57],dtype=np.float32)
>>> type(arr[-1])
<type ‘numpy.float32’>
>>> arr[-1]
4.57
>>> type(4.57)
<type ‘float’>
>>> arr[-1].item()
4.570000171661377
>>> type(arr[-1].item())
<type ‘float’>
>>>
详情参考 https://stackoverflow.com/questions/9452775/converting-numpy-dtypes-to-native-python-types

用你的方法解决了问题,谢谢。

一般 numpy 比较的时候用 np.isclose 或者 np.allclose

In [1]: arr = np.array([3.12, 3.43, 3.77, 4.15, 4.57],dtype=np.float32)

In [2]: np.isclose(arr[-1], 4.57)
Out[2]: True

浮点数一般不直接做相等,除非 dtype 也是一样的。python 里的小数一般是 np.float64

In [4]: arr = np.array([3.12, 3.43, 3.77, 4.15, 4.57],dtype=np.float64)

In [5]: arr[-1] == 4.57
Out[5]: True

我记得 numpy 官网文档里提过建议用 np.isclose()

谢谢又学到新东西。

回到顶部