社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python之谜:四舍五入round(4.5)等于4?

Python编程 • 2 年前 • 408 次点击  
来自公众号:程序员zhenguo

你好,我是zhen guo!

四舍五入4.5,应该返回结果5,但是使用Python或NumPy内置的round方法计算,结果都返回结果4

先来还原一下:

In [1]: round(4.5)
Out[1]: 4

In [2]: import numpy as np
In [3]: np.round(4.5)
Out[3]: 4.0

如果再看一个例子,四舍五入保留小数点后1位,发现它又是进位的:

In [1]: round(4.15,1)
Out[1]: 4.2

round背后

Python的round使用奇进偶舍方法。

奇进偶舍,是一种计数保留法,是一种数值简化规则。

从统计学的角度,“奇进偶舍”比“四舍五入”更为精确:在大量运算时,因为舍入后的结果有的变大,有的变小,更使舍入后的结果误差均值趋于零

而不是像四舍五入那样逢五就进位,导致结果偏向大数,使得误差产生积累进而产生系统误差。“奇进偶舍”使测量结果受到舍入误差的影响降到最低。

奇进偶舍与四舍五入不同之处的规则有:

  1. 保留位数的后一位如果是5,而且5后面仍有数。例如5.2254保留两位小数为5.23,也就是说如果5后面还有数据,则无论奇偶都要进入。

  2. 保留位数的后一位如果是5,而且5后面不再有数,要根据应看尾数“5”的前一位决定是舍去还是进入:

  • 2.1 如果是奇数则进入
  • 2.2 如果是偶数则舍去。
  • 2.3 例如5.215保留两位小数为5.22,尾数5的前一位是奇数1;    5.225保留两位小数为5.22,尾数5的前一位是偶数2

因此,看到这里,知道奇进偶舍规则后,就回答了第1节所遇问题。

一定要四舍五入

如果期待程序的执行结果,必须严格按照数学定义的四舍五入来计算,使用round就不行了。那么还有其他实现方法吗?

一定有的!使用Python的内置模块decimal

from decimal import Decimal, ROUND_HALF_UP
Decimal(4.5).quantize(Decimal('0'), rounding=ROUND_HALF_UP) 

结果:

Decimal('5')   

ROUND_HALF_UP对应数学中的四舍五入,再看4.15四舍五入保留1位:

Decimal(4.15).quantize(Decimal('1.0'), rounding=ROUND_HALF_UP)

结果:

Decimal('4.2')

以上,希望对你有帮助。

--- EOF ---


推荐↓↓↓

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/148652
 
408 次点击