round()和numpy.round()之间有什么不同之处?

时间:2013-12-04 23:12:21

标签: python numpy rounding

让我们来看看令人震惊的圆形声明:

>>> round(2.675, 2)
2.67

我知道为什么围绕“失败”;这是因为2.675的二进制表示:

>>> import decimal
>>> decimal.Decimal(2.675)
Decimal('2.67499999999999982236431605997495353221893310546875')

我不明白的是:为什么NumPy不会失败

>>> import numpy
>>> numpy.round(2.675, 2)
2.6800000000000002

思考

不要介意额外的零;这是Python打印内部四舍五入的人工制品。如果我们看一下“确切”的值,它们仍然是不同的:

>>> decimal.Decimal(round(2.675, 2))
Decimal('2.6699999999999999289457264239899814128875732421875')

>>> decimal.Decimal(numpy.round(2.675, 2))
Decimal('2.680000000000000159872115546022541821002960205078125')

为什么NumPy表现为什么?

我一开始认为NumPy必须使用额外的位来处理浮点数,但是:

>>> decimal.Decimal(numpy.float(2.675))
Decimal('2.67499999999999982236431605997495353221893310546875')
>>> decimal.Decimal(2.675)
Decimal('2.67499999999999982236431605997495353221893310546875')
# Twins!

窗帘背后发生了什么?我看了一下NumPy的round implementation,但我是一个Python新手,我没有看到任何过于腥的东西。

1 个答案:

答案 0 :(得分:3)

记录了引擎盖上的差异:

如果您在数字中间,np.round向最接近的“偶数”舍入(乘以10**n后,其中n是相应round的第二个参数1}} function)而builtin round从0开始。

>>> np.round(2.685, 2)
2.6800000000000002
>>> round(2.685, 2)
2.69

在幕后,您可以在使用缩放参数时获得差异。考虑round(2.675 * 10.**2)round(2.675, 2)之间的差异。这肯定是浮点数学的结果,它一直有一些与之相关的舍入误差。为了更进一步,我们真的需要看看真正的实现。