python - round() 和 numpy.round() 之间的底层区别是什么?

标签 python numpy rounding

让我们看一下那句令人震惊的round语句:

>>> 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 必须使用额外的位来处理 float ,但是:

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

幕后发生了什么?我看了看 NumPy 的 round implementation ,但我是 Python 新手,我没有看到任何可疑的东西。

最佳答案

一个最重要的区别被记录在案:

如果您处于数字中间,np.round舍入到最接近的“偶数”数(乘以 10**n 后,其中 n 是相应 round 函数的第二个参数)而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) 之间的区别。这当然是 float 学的结果,它总是有一些与之相关的舍入误差。要走得更远,我们真的需要看看真正的实现。

关于python - round() 和 numpy.round() 之间的底层区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20388071/

相关文章:

python - MATLAB sort() vs Numpy argsort() - 如何匹配结果?

python - 在 n 维中扩展 numpy 数组

rounding - Terraform 是否支持数学舍入?

ruby - 四舍五入后总和不为100怎么办?

python - 尝试在 OSX 上打开与 hidapi/hid 的连接时收到 'ValueError: not open'

python 日志记录根本不起作用

python - (Python/JSON/MySQL) 关于 JSON 格式的财务数据不会传输到数据库的建议

Python Pandas 创建一长串数据框以进行连接

mysql - 如何将时间四舍五入到最接近的 15 分钟段

c# - 如何使用 C# 客户端使用 Django/Python web 服务(所有方法都返回 null)?