python之关于round函数的bug

本文探讨了Python中round函数的奇进偶舍规则,指出其在不同版本Python中的行为变化,并通过实例展示了浮点数精度问题,建议在需要高精度计算时避免使用round函数,推荐使用math模块和decimal模块。
摘要由CSDN通过智能技术生成

round()函数:此函数慎用!!!
作用:返回浮点数x的“奇进偶舍值”。

round() 方法的语法:
round( x [, n] )

参数:
x – 数值表达式。
n – 数值表达式,表示保留小数点后的位数。

返回值:
返回浮点数x的“奇进偶舍值”。

注意:-------------- 该方法和python版本有关。
阅读python的文档,里面是这么写的:
在python2.7的doc中,round()的最后写着,“Values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done away from 0.” 保留值将保留到离上一位更近的一端(四舍六入),如果距离两端一样远(即要舍去或者进位的那一位是五),则保留到离0远的一边。所以round(0.5)会近似到1,而round(-0.5)会近似到-1。

但是到了python3.5的doc中,文档变成了"values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice." 如果距离两端一样远,会保留到偶数的一边。比如round(0.5)和round(-0.5)都会保留到0,而round(1.5)会保留到2。

奇进偶舍: 又称为四舍六入五成双规则、银行进位法(Banker’s Rounding),是一种计数保留法,是一种数值修约规则(在进行具体的数字运算前,通过省略原数值的最后若干位数字,调整保留的末位数字,使最后所得到的值最接近原数值的过程。)。从统计学的角度,“奇进偶舍”比“四舍五入”更为精确:在大量运算时,因为舍入后的结果有的变大,有的变小,更使舍入后的结果误差均值趋于零。而不是像四舍五入那样逢五就进位,导致结果偏向大数,使得误差产生积累进而产生系统误差。“奇进偶舍”使测量结果受到舍入误差的影响降到最低。
我们发现,使用round()取整小数时,并不是想要的四舍五入,原因就在于取整规则是采用了奇进偶舍(四舍六入五成双)的方式,简单来说就是:整数部分为奇数,四舍五入;如果是偶数,就采用五舍六入的方式,而这个规则,就属于数值修约的规则。

下面我们用实例演示:

a = round(1.4)
b = round(1.5)
c = round(1.6)
d = round(2.4)
e = round(2.5)
f = round(2.6)
print('整数部分为奇数时:',a , b, c )
print('整数部分为偶数时:',d , e, f )

运行结果:
整数部分为奇数时: 1 2 2
整数部分为奇数时: 2 2 3

由以上结果发现,round函数在保留到整数时确实使用的奇进偶舍方法。

但是: 上面我们看到了浮点数去掉小数变成整数时是奇进偶舍法,下面来看看浮点数不保留到整数时是不是还是奇进偶舍法。

a = round(1.45,1)
b = round(2.45,1)
c = round(1.15,1)
d = round(2.15,1
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值