打印的值不正确。在您的情况下,使用时y
小于使用时1
,使用时float64
大于或等于. 这是意料之中的,因为舍入误差取决于.1
float32
float
为避免此类问题,在处理浮点数时,您应该始终确定“最小误差”,通常称为“最小误差”,而不是比较是否相等,而是检查结果是否与目标值epsilon
最远:epsilon
In [13]: epsilon = 1e-11
In [14]: number = np.float64(1) - 1e-16
In [15]: target = 1
In [16]: abs(number - target) < epsilon # instead of number == target
Out[16]: True
特别是,numpy
已经提供了np.allclose
在给定一定容差的情况下比较数组是否相等的有用的方法。即使参数不是数组(例如np.allclose(1 - 1e-16, 1) -> True
),它也可以工作。
但是请注意,numpy.set_printoptions
这不会影响np.float32
/64
的打印方式。它只影响数组的打印方式:
In [1]: import numpy as np
In [2]: np.float(1) - 1e-16
Out[2]: 0.9999999999999999
In [3]: np.array([1 - 1e-16])
Out[3]: array([ 1.])
In [4]: np.set_printoptions(precision=16)
In [5]: np.array([1 - 1e-16])
Out[5]: array([ 0.9999999999999999])
In [6]: np.float(1) - 1e-16
Out[6]: 0.9999999999999999
另请注意,在交互式解释器中执行print y
或评估会产生不同的结果:y
In [1]: import numpy as np
In [2]: np.float(1) - 1e-16
Out[2]: 0.9999999999999999
In [3]: print(np.float64(1) - 1e-16)
1.0
不同之处在于在评估调用时print
调用:str
repr
In [9]: str(np.float64(1) - 1e-16)
Out[9]: '1.0'
In [10]: repr(np.float64(1) - 1e-16)
Out[10]: '0.99999999999999989'