
1 ybping 2018-11-05 12:14:20 +08:00 via iPhone 浮点数比较相等没意义 |
2 zicla 2018-11-05 12:17:34 +08:00 你猜 js 中 0.1+0.2 等于多少? 不是 0.3,而是 0.30000000000000004。所以楼上正解,浮点数不适合做等的比较。 |
3 rabbbit 2018-11-05 12:24:41 +08:00 arr = np.array([ 4.57],dtype=np.float64) arr[0] == 4.57 # True |
4 huashengshu 2018-11-05 12:28:02 +08:00 浮点精度损失 |
5 MinQ 2018-11-05 12:29:40 +08:00 via Android 浮点数都是相减小于 0.000001 啥就算相等 |
6 wizardoz 2018-11-05 12:42:42 +08:00 永远不要用两个浮点数比较相等 |
7 XuanFei990 2018-11-05 12:48:50 +08:00 这个问题,在 C 语言里不就应该知道了么,,, 难道不学 C 语言?好吧。。 浮点数比较一般都是两数相减,小于一个误差值就可以认为是相等了。。。 |
8 rabbbit 2018-11-05 12:54:42 +08:00 >>> '{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' |
9 pinews 2018-11-05 13:01:18 +08:00 <?php $a=0.1; $b=0.2; $c=0.3; var_dump(bccomp(bcadd($a, $b), $c)); ?> |
10 aimiyooo 2018-11-05 13:32:54 +08:00 浮点数不能直接比较相等,只能|a-b|<c(一个小数)来判断 |
11 songdg OP 谢谢大家的帮助,还有一个问题 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]却是正确的。 |
12 blindpirate 2018-11-05 14:24:22 +08:00 “浮点数都比较没有意义”的意思是,无论相等还是不等,都没有意义。 |
14 neoblackcap 2018-11-05 14:37:12 +08:00 因为不管是 C 语言还是 Python 的浮点都是用 IEEE 754,这个没法表示准确的 10 进制小数。 |
15 1a0ma0 2018-11-05 14:38:31 +08:00 via iPhone 你应该去查查浮点数在计算机里是怎么表示的。 |
16 mario85 2018-11-05 15:44:51 +08:00 @songdg >>> 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 |
17 Alias4ck 2018-11-05 17:03:09 +08:00 很简单一个问题。一个是 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'> 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 |
18 mingyun 2018-11-05 23:05:41 +08:00 |
20 necomancer 2018-11-11 02:23:40 +08:00 一般 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() |
21 songdg OP @necomancer 谢谢又学到新东西。 |