python 如何四舍五入

您所在的位置:网站首页 python中如何取个位数 python 如何四舍五入

python 如何四舍五入

2023-12-18 17:31| 来源: 网络整理| 查看: 265

round()函数—奇进偶舍

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

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

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

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

奇进偶舍的具体规则

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

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

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

如果保留位数的后一位如果是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

如果保留位数的后一位如果是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后面这个参数用字符串形式



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3