numpy`rint`奇怪的行为

Kar*_*tik 2 python numpy python-3.x

这个问题是关于numpy.rint,根据定义,该值将四舍五入到最接近的整数。但是,以下代码会产生不一致的结果。

In [1]: import numpy as np
        for i in range(5, 105, 10):
            print(i, np.rint(i/10))
Out[1]: 5 0 # Should be 1
        15 2 # Correct
        25 2 # Should be 3
        35 4 # Correct
        45 4 # Should be 5
        55 6 # Correct
        65 6 # Should be 7
        ...
Run Code Online (Sandbox Code Playgroud)

因此,似乎存在一种模式:如果除以10后,单位位置是偶数,则将数字四舍五入,但如果单位位置是奇数,则将数字四舍五入。但是,根据四舍五入规则,单位位置应该没有关系!

要么numpy使用“四舍五入”,即正好一半,四舍五入到下一个整数,要么使用“四舍五入”。它不能同时做到,而且前后不一致。

通常,我会为此打开一个错误报告numpy,但是我不确定这是numpy不是很奇怪,或者是关于python解释浮点数的一些潜在的怪癖,还是由于转换到二进制和返回时的精度损失

请注意,numpy.round(i, 0)其行为也相同。


解决方法是在除以10:之后添加一小部分numpy.rint(i/10 + 0.1),然后答案正确。

Tim*_*ers 5

自从IEEE 754标准几乎被普遍采用以来,数字函数已经聚集到“四舍五入到四舍五入”的舍入过程,其描述可以在您链接到的同一Wikipedia页面上找到,但略有下降

在这里,基本转换期间的精度损失不是问题,因为在此范围内整数到浮点数(C双精度数)的转换是精确的,并且商数可以用二进制浮点数精确表示。

添加0.1并非明智的解决方法。例如,将0.1添加到4.42,您将得到4.52,它四舍五入到5.0,而不是正确的4.0。