我刚刚重读了What’s New In Python 3.0页,上面写着:

round()函数的舍入策略和返回类型已更改.

round:

对于支持round()的内置类型,值被舍入到

所以,v2.7.3岁以下:

In [85]: round(2.5)
Out[85]: 3.0

In [86]: round(3.5)
Out[86]: 4.0

正如我所料.然而,现在不到v3.2.3岁:

In [32]: round(2.5)
Out[32]: 2

In [33]: round(3.5)
Out[33]: 4

这似乎违反直觉,与我的理解相反

  1. 有人知道为什么会变成这样吗?
  2. 还有没有其他主流编程语言(例如,C, C++, Java, Perl,.)做这种(对我来说不一致的)取整的?

我错过了什么吗?

UPDATE: @Li-aungYip's comment re "Banker's rounding" gave me the right search term/keywords to search for and I found this SO question: Why does .NET use banker's rounding as default?, so I will be reading that carefully.

推荐答案

Python3的方法(称为"round half to even"或"银行家舍入")现在被认为是标准的舍入方法,尽管有些语言实现还没有出现.

简单的"always round 0.5 up"技术会导致略微偏向更高的数字.在大量计算的情况下,这可能非常重要.Python 3.0方法消除了这个问题.

常用的四舍五入方法不止一种.浮点数学的国际标准IEEE 754定义了five different rounding methods(Python 3.0使用的是默认值).和there are others.

这种行为并不像应有的那样广为人知.如果我没记错的话,AppleScript是这种舍入方法的早期采用者.round command in AppleScript提供了几个选项,但在IEEE 754中,舍入到偶数是默认值.显然,执行round命令的工程师厌倦了"让它像我在学校学到的那样工作"的所有要求,他只执行了:round 2.5 rounding as taught in school是一个有效的AppleScript命令.:-)

Python相关问答推荐

Pandas .类型错误:只能将字符串(而不是int)连接到字符串

Python中的锁定类和线程以实现dict移动

将列表中的元素替换为收件箱中的元素

模型序列化器中未调用现场验证器

Polars:使用列值引用when / then表达中的其他列

Python plt.text中重叠,包adjust_text不起作用,如何修复?

如何用symy更新分段函数

具有症状的分段函数:如何仅针对某些输入值定义函数?

GL pygame无法让缓冲区与vertextPointer和colorPointer一起可靠地工作

列表上值总和最多为K(以O(log n))的最大元素数

acme错误-Veritas错误:模块收件箱没有属性linear_util'

如何从具有不同len的列表字典中创建摘要表?

将两只Pandas rame乘以指数

Mistral模型为不同的输入文本生成相同的嵌入

删除字符串中第一次出现单词后的所有内容

numpy卷积与有效

如何获得每个组的时间戳差异?

Asyncio:如何从子进程中读取stdout?

Python逻辑操作作为Pandas中的条件

幂集,其中每个元素可以是正或负""""