我刚刚重新阅读Python 3.0中的新功能,它指出:
round()函数舍入策略和返回类型已更改.确切的中途情况现在四舍五入到最接近的偶数结果而不是零.(例如,round(2.5)现在返回2而不是3.)
和圆形文件:
对于支持round()的内置类型,值被舍入到10的最接近的倍数到幂减去n; 如果两个倍数相等,则向均匀选择进行舍入
所以,在v2.7.3下:
In [85]: round(2.5)
Out[85]: 3.0
In [86]: round(3.5)
Out[86]: 4.0
Run Code Online (Sandbox Code Playgroud)
正如我所料.但是,现在在v3.2.3下:
In [32]: round(2.5)
Out[32]: 2
In [33]: round(3.5)
Out[33]: 4
Run Code Online (Sandbox Code Playgroud)
这似乎是违反直觉的,与我对四舍五入的理解相反(并且必然会绊倒人).英语不是我的母语,但在我读到这篇文章之前,我以为我知道舍入的含义是什么: - /我确信在引入v3的时候一定有一些关于这个的讨论,但是我无法找到一个很好的理由我的搜索.
我在这里错过了什么?
更新:@ Li-aungYip的评论"银行家的舍入"给了我正确的搜索词/搜索关键字,我发现了这个问题:为什么.NET使用银行家的舍入作为默认值?所以我会仔细阅读.
" Python中"round"函数的行为 "观察到Python循环浮动如下:
>>> round(0.45, 1)
0.5
>>> round(1.45, 1)
1.4
>>> round(2.45, 1)
2.5
>>> round(3.45, 1)
3.5
>>> round(4.45, 1)
4.5
>>> round(5.45, 1)
5.5
>>> round(6.45, 1)
6.5
>>> round(7.45, 1)
7.5
>>> round(8.45, 1)
8.4
>>> round(9.45, 1)
9.4
Run Code Online (Sandbox Code Playgroud)
接受的答案证实这是由于浮点数的二进制表示不准确引起的,这都是合乎逻辑的.
假设Ruby浮点数和Python一样不准确,那么Ruby如何像人类一样漂浮?Ruby欺骗了吗?
1.9.3p194 :009 > 0.upto(9) do |n|
1.9.3p194 :010 > puts (n+0.45).round(1)
1.9.3p194 :011?> end
0.5
1.5
2.5
3.5
4.5
5.5
6.5
7.5
8.5
9.5
Run Code Online (Sandbox Code Playgroud) 我是Python的初学者,我有一个问题.
为什么舍入一个数字,如5.5,7.5,(任何).5与奇数整数部分应用round(num)正常工作(规则5/4),但舍入数字像(任何).5与非奇数整数部分由同一函数返回整数部分?(但是如果我们在这个十进制数字上添加一个像0.000000001这样的小数字就能正常工作)
我的意思是下一个:
round(9.5)
Run Code Online (Sandbox Code Playgroud)
返回10,这是正确的.但
round(8.5)
Run Code Online (Sandbox Code Playgroud)
返回8,这是不正确的.和
round(8.5 + 0.0000000000001)
Run Code Online (Sandbox Code Playgroud)
返回9.
为什么它不正确?
我在Windows上使用Python 3.2.2.