你好,我是zhen guo!
四舍五入4.5,应该返回结果5,但是使用Python或NumPy内置的round方法计算,结果都返回结果5
先来还原一下:
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'
)

以上,希望对你有帮助。
继续阅读
阅读原文