python numpy arange:奇怪的行为

时间:2018-06-02 08:54:27

标签: python numpy

Python 2.7.9 (default, Jun 29 2016, 13:08:31)
IPython 5.6.0 -- An enhanced Interactive Python.
In [1]: import numpy as np

In [2]: np.__version__
Out[2]: '1.14.3'

In [3]: np.arange(1.1, 1.12, 0.01)
Out[3]: array([1.1 , 1.11, 1.12])

In [4]: np.arange(1.1, 1.13, 0.01)
Out[4]: array([1.1 , 1.11, 1.12])

在这两种情况下,数组都会达到1.12 ......你会如何解释?

1 个答案:

答案 0 :(得分:3)

由于浮点错误,1.10.010.12不像人们预期的那样精确,它们之间也没有数学运算。例如:

>>> 1.1 + 0.01 + 0.01 + 0.01
1.1300000000000001

另见:

>>> decimal.Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>> decimal.Decimal(1.12)
Decimal('1.12000000000000010658141036401502788066864013671875')

如果确切,np.arange(1.1, 1.12, 0.01)将是array([1.1 , 1.11])

np.arange规范也提到了:它写的stop参数:

  

停止号码

     

间隔结束。间隔不包括此值,除了   某些情况下step不是整数和浮点舍入   影响外出的长度。

您可以通过始终指定两个步骤之间的上限而不是完全在边界上来避免此问题:

>>> np.arange(1.1, 1.115, 0.01)
array([1.1 , 1.11])
>>> np.arange(1.1, 1.125, 0.01)
array([1.1 , 1.11, 1.12])
>>> np.arange(1.1, 1.135, 0.01)
array([1.1 , 1.11, 1.12, 1.13])