python中的np.ceil不';我不能在循环中工作

python中的np.ceil不';我不能在循环中工作,python,Python,我是python新手,我对np.ceil函数有一个问题。所以当我做np.ceil(10/0.1)时,我得到100,这就是我所期望的。但是,当我在for循环中执行此操作时: interval = np.arange(0.01,0.2,0.01) for i in interval: print(np.ceil(10/i)) 对于I的所有值,除I=0.1外,我都获得了正确的结果。我得到的是101而不是100。有人能告诉我为什么会这样吗?谢谢大家! 它与是否在变量中无关。这些值完全不同: I

我是python新手,我对np.ceil函数有一个问题。所以当我做
np.ceil(10/0.1)
时,我得到100,这就是我所期望的。但是,当我在for循环中执行此操作时:

interval = np.arange(0.01,0.2,0.01)
for i in interval:
    print(np.ceil(10/i))

对于I的所有值,除I=0.1外,我都获得了正确的结果。我得到的是101而不是100。有人能告诉我为什么会这样吗?谢谢大家!

它与是否在变量中无关。这些值完全不同:

In [9]: interval
Out[9]:
array([ 0.01,  0.02,  0.03,  0.04,  0.05,  0.06,  0.07,  0.08,  0.09,
        0.1 ,  0.11,  0.12,  0.13,  0.14,  0.15,  0.16,  0.17,  0.18,  0.19])

In [10]: x = interval[9]

In [11]: x
Out[11]: 0.099999999999999992

In [12]: i = 0.1

In [13]: x == i
Out[13]: False
请注意,这两个数字都不是精确的
0.1
,因为无法使用二进制浮点精确表示该数字。另请注意:

In [14]: type(x), type(i)
Out[14]: (numpy.float64, float)

尽管如此,这并不重要。

您可以通过四舍五入强制使用另一个浮点表示法

在您的具体情况下,这应该可以做到这一点

interval = np.arange(0.01,0.2,0.01)
for i in interval:
    if i == 0.1:
        print('this will miss')
    if i == interval[9]:
        print('this will hit')
    j = round(i, 3)
    print(np.ceil(10/i), np.ceil(10/j))

浮点数学是近似的,但为什么它适用于所有其他数学?为什么当我使用0.1时它工作,但当我=0.1时它不工作?非常感谢。“但是为什么它对所有其他的都有效?”-完全是侥幸。你可以使用
decimal.decimal
来获得任意精度。但这需要速度/内存成本,您必须实现自己的
arange
函数。当然,
decimal.decimal
实际上无法解决问题;它只是让问题案例与人类直觉预期的问题案例更为吻合。例如,
floor(1/十进制(9)*十进制(9))==0
。哦,我明白了。有什么办法可以解决这个问题吗?@BillKet具体解决什么问题?要得到我想要的数字,它是0.1而不是0.099999999992。@BillKet您可以使用
decimal.decimal
对象,而不是
float
numpy.float64
对象。它们可以精确地表示十进制数,但这需要速度/内存成本。您可能还需要实现自己的
arange
功能。下面是文档:@BillKet还需要注意的是,正如有人在评论中指出的,
decimal.decimal
不能解决所有问题,因为你不能拥有无限的精度。