Python round 四舍五入分析讨论

原文: Python3 数字(Number)

   happy_ing

文中对于 _ 提到,它代表了上一次的输出结果,"用户应该将其视为只读变量",实际情况是你也可以对于_ 赋值,_=10 是没有毛病的,但这样的结果会导致你在之后调用 _ 的时候全部变成了10,除非你 del _

对于round:

>>> round(10.5)
10
>>> round(11.5)
12
>>>

Python 所谓的奇进偶弃,因为浮点数的表示在计算机中并不准确,用的时候可能要注意一下。

还可以参考这篇文章: Python 中关于 round 函数的小坑

更多解析

  DZ_小白王子

由于上面大神的提出,我又看了一下

print(round(10.4)) #10
print(round(10.5)) #10
print(round(10.6)) #11
print()
print(round(11.4)) #11
print(round(11.5)) #12
print(round(11.6)) #12

由运行得出结论:

  1. 当小数点左边为偶数:小数点右边X<6,舍
  2. 当小数点左边为偶数:小数点右边X>=6,入
  3. 当小数点左边为奇数:小数点右边X<5,舍
  4. 当小数点左边为奇数:小数点右边X>=5,入

所以当小数点左边分别为奇数和偶数的时候,小数点右边的取舍也分别对应两种取舍标准

这是个坑啊!不知道小数点后两位是怎样的,有兴趣的小伙伴可以试一下,记得@我,谢谢!

  春天的诗

关于round,接力分析,结论如下:

当个位为奇数,小数部分>=0.5入,其余为舍

当个位为偶数,小数部分>0.5入,其余为舍。

交互模式下的 example:

>>> round(10.49)
10
>>> round(10.50)
10
>>> round(10.51)
11
>>> round(11.50)
12
>>> round(11.49)
11

  刘亚彬

“4舍6入5看齐,奇进偶不进”我觉得并不是因为浮点数在计算机表示的问题。计算机浮点数的表示是 ieee 定义的标准规则,如果 python 中存在,没道理其他语言中不存在。事实上是因为该取舍方法比过去的 "四舍五入" 方法在科学计算中更准确。而国家标准也已经规定使用 “4舍6入5看齐,奇进偶不进” 取代"四舍五入".

从统计学的角度上来讲,如果大量数据无脑的采用四舍五入会造成统计结果偏大。而"奇进偶舍"可以将舍入误差降到最低。

奇进偶舍是一种比较精确比较科学的计数保留法,是一种数字修约规则。

其具体要求如下(以保留两位小数为例):

  • (1)要求保留位数的后一位如果是4或者4以下的数字,则舍去, 例如 5.214保留两位小数为5.21。
  • (2)如果保留位数的后一位如果是6或者6以上的数字,则进上去, 例如5.216保留两位小数为5.22。
  • (3)如果保留位数是保留整数部分或保留一位小数,则要根据保留位来决定奇进偶舍:
    >>> round(5.215,2)#实际并没有进位
    5.21
    >>> round(5.225,2)
    5.22
    >>>
    >>> round(1.5)#此处进位
    2
    >>> round(1.5)==round(2.5)#偶数舍去
    True
    >>> round(1.15,1)
    1.1
    >>> round(1.25,1)
    1.2
    >>> round(1.151,1)
    1.2
    >>> round(1.251,1)
    1.3
    
  • (4) 如果保留位数的后一位如果是5,且该位数后有数字。则进上去,例如5.2152保留两位小数为5.22,5.2252保留两位小数为5.23,5.22500001保留两位小数为5.23。
从统计学的角度,“奇进偶舍”比“四舍五入”要科学,在大量运算时,它使舍入后的结果误差的均值趋于零,而不是像四舍五入那样逢五就入,导致结果偏向大数,使得误差产生积累进而产生系统误差,“奇进偶舍”使测量结果受到舍入误差的影响降到最低。

  永远的兄弟

关于小数的四舍五入问题与电脑的二进制和十进制之间转换问题,这不仅是出现在小数上,也出现在一些除法上,例如:

10/3=3.3333333333333335 而不是约等于 3.3333……:

>>> 10/3
3.3333333333333335

还有就是 0.1+0.1+0.1-0.3 不会等于 0,而是等于 5.551115123125783e-17:

>>> 0.1+0.1+0.1-0.3
5.551115123125783e-17