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后面这个参数用字符串形式

python 如何四舍五入相关推荐

  1. python解决四舍五入问题

    python解决四舍五入问题 参考文章: (1)python解决四舍五入问题 (2)https://www.cnblogs.com/kevenwork/p/10278029.html 备忘一下.

  2. 如何在Python中四舍五入数字

    It's the era of big data, and every day more and more business are trying to leverage their data to ...

  3. [转载] Python round四舍五入精度缺失的解决

    参考链接: Python round() 问题 一般的四舍五入操作都是使用内置的round方法,但有时候会出现问题.比如 In [1]: round(2.675,2) Out[2]: 2.67 为什么 ...

  4. Python中四舍五入的讲解

    round()函数 (注意:下面的我也不清楚是否正确,我只是发表一下我的观点) 对于简单的舍入运算,使用内置的 round(value, ndigits) 函数即可 强烈建议不要去深究,就直接得结果就 ...

  5. python 实现四舍五入,向上取整、向下取整

    百度一下python 四舍五入, 大部分是用round,实际上,因为计算机存储的是二进制,使用round做十进制的四舍五入,会有一定的影响.以下对几种方式进行说明. 一.round实现的四舍五入 pr ...

  6. python decimal四舍五入_python精确地进行浮点数的四舍五入

    做python实验时碰到这么一道题: 输入三个浮点数,求它们的平均值并保留 1 位小数,对小数后第二位数进行四舍五入,最后输出结果 错误示范 因为涉及到四舍五入,随便搜了一下,发现了好多博客都用rou ...

  7. python实现四舍五入

    链接:https://ac.nowcoder.com/acm/problem/20760 来源:牛客网 题目描述 依次输入一个学生的学号,以及3科(C语言,数学,英语)成绩,在屏幕上输出该学生的学号, ...

  8. python结果四舍五入保留两位小数_Python-根据四舍五入精确保留小数位数的方法...

    目前,Python版本中关于保留指定小数位数的常用方法有以下几种: 1. 使用round()内置函数 print(round(1.234, 2)) 输入结果为:1.23 round()函数中的第一个变 ...

  9. python round()四舍五入有偏差 注意了解

    round(0.6)  =1 round(0.5)  =0 https://www.runoob.com/python/func-number-round.html

最新文章

  1. Qt+MinGW+OpenCV开发环境在win7系统下的搭建(最新20140423)
  2. basler相机 ip linux,Linux环境中连接Basler相机(Pylon软件的安装),ROS环境中连接Basler相机...
  3. 转:Oracle 中union的用法
  4. BulkLoader类使用
  5. c语言编写两个矩阵的乘积,如何用c语言编写两个模糊矩阵相乘的程序?
  6. 收藏 | 在yolov5上验证一些不成熟的想法
  7. 顺风车订单已结束仍在录音 嘀嗒出行回应录音机制
  8. 哈尔滨工程大学ACM预热赛(A,C,H,I)
  9. 《Linux就该这么学》正式版电子书发布!
  10. innerHTML, innerText, outerHTML, outerText的区别
  11. 如何禁用或重新启用计算机的休眠功能
  12. 语音识别:声学的要素和特征
  13. Java 求解买卖股票的xx时机含手续费
  14. 2370 小机房的树
  15. H5头像完整制作,可拖拽缩放,可添加装饰图标(装饰图标支持缩放、旋转、拖拽)
  16. tinyalsa工具命令
  17. python快速入门【五】---- 面向对象编程、python类
  18. AS5047开发简介
  19. ECharts之3D立体柱状图一
  20. 用友U8服务器修改数据库端口,用友U8服务器修改数据库端口

热门文章

  1. 计算机桌面字小怎么调大,电脑字体太小怎么调,小编教你怎样更改电脑界面的字体大小...
  2. 线上问题排查常用命令
  3. python逗号怎么打_在Python中输出逗号分隔的方法有哪些
  4. linux tty 软件包,linux学习之安装ttylinux(世界最小的linux操作系统)(转载)
  5. 史上最详细宝塔面板安装教程(收藏)
  6. nvidia jetson nano 风扇控制
  7. 2023年全国最新保安员精选真题及答案7
  8. JavaEE Spring(组装打印机)
  9. 用Python做股票量化分析[附量化交易学习资料]
  10. [少女时代][分享]171031 SONE NOTE LIVE vol.12公开 允儿挑战艺术字体书写