python 如何四舍五入

round()函数—奇进偶舍

奇进偶舍,又称为四舍六入五成双规则、银行进位法。

它是一种计数保留法。从统计学的角度,“奇进偶舍”比“四舍五入”更为精确:在大量运算时,因为舍入后的结果有的变大,有的变小,更使舍入后的结果误差均值趋于零。而不是像四舍五入那样逢五就进位,导致结果偏向大数,使得误差产生积累进而产生系统误差。

“奇进偶舍”使测量结果受到舍入误差的影响降到最低。

但是 这样就会间接的影响到我们试图实现四舍五入的操作。

奇进偶舍的具体规则

  1. 要求保留位数的后一位如果是4,则舍去。例如5.214保留两位小数为5.21。

  2. 如果保留位数的后一位如果是6,则进上去。例如5.216保留两位小数为5.22。


上面这两点是和四舍五入相同的,差别出现在下面,当需要保留的位数的后一位,为5的时候。

  1. 如果保留位数的后一位如果是5,而且5后面不再有数,要根据应看尾数“5”的前一位决定是舍去还是进入: 如果是奇数则进入,如果是偶数则舍去。例如5.215保留两位小数为5.22; 5.225保留两位小数为5.22。

    a=round(5.215,2)
    b=round(5.225,2)
    print('a={0} b={1}'.format(a,b))
    

得到

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

    a=round(5.2254,2)
    b=round(5.2153,2)
    print('a={0} b={1}'.format(a,b))
    

得到

	a=5.23 b=5.22

也就是说,用round(a,b)不能保证将浮点数a四舍五入保留b位小数


那,decimal()呢?貌似老师提过一句保留几位小数的时候用decimal。

from decimal import *
a1=Decimal(5.215).quantize(Decimal('0.00'))
a2=Decimal(5.225).quantize(Decimal('0.00'))
a3=Decimal(5.245).quantize(Decimal('0.00'))
a4=Decimal(5.265).quantize(Decimal('0.00'))
a5=Decimal(5.285).quantize(Decimal('0.00'))
print(a1,a2,a3,a4,a5)

结果也是令人失望…甚至没找到规律

5.21 5.22 5.25 5.26 5.29

但是当第一个数据传入字符串时

from decimal import *

a1 = Decimal('5.215').quantize(Decimal('0.00'))
a2 = Decimal('5.225').quantize(Decimal('0.00'))
a3 = Decimal('5.245').quantize(Decimal('0.00'))
a4 = Decimal('5.275').quantize(Decimal('0.00'))
a5 = Decimal('5.285').quantize(Decimal('0.00'))
print(a1, a2, a3, a4, a5)

得到

5.22 5.22 5.24 5.28 5.28

是奇进偶舍了…不过,这又是为什么呢。


我们从python官方文档去寻找线索
https://docs.python.org/zh-cn/3/library/decimal.html#decimal.Decimal.quantize

在这里插入图片描述

也就是说,在我们往decimal中存入浮点数时,若是这个浮点数数值无法被计算机精确的存储,那么它就会先被转存为一个二进制的值,再转化为等效(53位甚至更多位来保证精度)的十进制值。因此
试图存入1.1时,其实是存入了1.100000000000000088817841970012523233890533447265625
试图存入1.125时,其实是存入了’1.1249999…’
所以才会 ↓↓↓↓↓

在这里插入图片描述
官方文档给出解决办法
在这里插入图片描述
当你传入‘1.125’作为decimal的参数时,存入的就是1.125 而不是二进制转化成的十进制“精确数字”

这样 ,DECIMAL做到了奇进偶舍,而不是刚刚上文那样无规律的取舍


最后,也是本文的关键所在, rounding=ROUND_HALF_UP 可以理解为到半向上取整。
结合字符串参数Decimal()

在这里插入图片描述

最终四舍五入格式:

a1 = Decimal('1.125').quantize(Decimal('0.00'),rounding=ROUND_HALF_UP)

如果整篇过于啰嗦不愿意看,,就记住上面这个格式,以及下面两点 就好。
①别忘了 引入decimal模块
②Decimal后面这个参数用字符串形式

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值