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. Android 侧滑栏 (DrawerLayout)
  2. python中while嵌套循环_python中的while循环
  3. iis cgi 无法使用_ASP.NET Core前后端分离项目使用gitlabci持续集成到IIS
  4. 【图文详解】第一个Java程序HelloWorld详解,写Java程序需要注意什么
  5. Asp.NET Core 中如何加密 Configuration ?
  6. 2017-2018 20155309 南皓芯 信息安全基础设计第八周博客
  7. mac安装mysql devel_Mac安装Mysql
  8. java格式化数字 NumberFormat及DecimalFormat
  9. 中兴笔试c语言,中兴c语言笔试题
  10. sipp uas 脚本
  11. linux u盘启动制作教程,cdlinux u盘启动制作教程
  12. 如何以最快速度将Vue接入在线客服系统?
  13. 服务器编程之路:进无止境(上)
  14. Python CT图像预处理——nii格式读取、重采样、窗宽窗位设置
  15. Java 图片转换base64
  16. linux 编译过程中acx_pthread.m4类错误解决办法
  17. 餐饮如何运用人工智能
  18. ant-design-vue对起始时间的校验
  19. spreadsheet php,PhpSpreadsheet的简单使用
  20. 如何使用Lumberyard制作特效[【1】——Overview

热门文章

  1. python是什么 ?他的特点是什么?
  2. java directui_win32 DirectUI控件开发与调用指南
  3. TO B销售员需要学习的销售经验
  4. 华为折叠屏从小屏启动APP,SHOW一个Dialog,显示问题
  5. JS随机生成颜色的几种极简代码
  6. linux带路径拷贝文件夹,带有路径的Linux复制文件
  7. 区块链技术应用落地 区块链版权保护
  8. android手机耗电量测试
  9. 【华为机试真题 JAVA】最多团队-100
  10. tsd3dmapper软件使用方法_三维图片重建软件 Pix4Dmapper