python3 小数位的四舍五入(用两种方法解决round 遇5不进)


Posted in Python onApril 11, 2019

round( )函数简介

菜鸟教程中介绍到,round() 函数作用就是,返回浮点数x的四舍五入值。

> round( x [, n] )

参数x,n均为数值表达式,返回值为x的四舍五入值。n为保留的小数位数,不加n则只保留x四舍五入后的整数部分。

>>> round(2.3)
2
>>> round(2.45, 1)
2.5

特殊情况

上面的结果并没有错误,这里再用2.675测试一下:

>>> round(2.675, 2)
2.67

显然结果不符合四舍五入的规则。为什么会这样呢?原因是:round()函数只有一个参数,不指定位数的时候,返回一个整数,而且是最靠近的整数,类似于四舍五入,当指定取舍的小数点位数的时候,一般情况也是使用四舍五入的规则,但是碰到.5的情况时,如果要取舍的位数前的小数是奇数,则直接舍弃,如果是偶数则向上取舍。

小数位的四舍五入在项目中经常用到,今天群里有人提出1.325 如何才能变成1.33?

当时我一看这么简单,分秒就可以解决:

我回复是这样的的

round(1.315,2)

有个小伙伴 当时就回复:

他要的结果是 1.32, 你打印出是1.31,我看到我想怎么可能呢,我自己运行下,

结果真是1.31 .

我想都没有想,自认为我是对的,好吧,怪不得开发不能测试自己的代码.

我就开始查找原因,我们通过代码进行讲解:

print(Decimal(1.325))

打印结果:

1.3249999999999999555910790149937383830547332763671875

大家看到了吗? 实际1.325用二进制转化的是有精度损失.部分小数无法完全用二进制表示.
这是根本所在.

那有的同学该说了,为什么 有的五能进1 能解释下原理吗?
原理和上边的一样,我举个例子 5可以进1

print(round(1.145,2))
#打印结果
1.15

继续查看二进制保存的值:

print(Decimal(1.145))
#打印结果 
1.145000000000000017763568394002504646778106689453125

大家明白了吧 ,round 本身没有问题,而是二进制保存的值有点误差导致的.

有的同学该说了 那怎么避免这种错误 。

我准备了两套方案

1.将数值放大100倍,以利用下面的精确的四舍五入的结果`

def round_up(value):
  # 替换内置round函数,实现保留2位小数的精确四舍五入
  return round(value * 100) / 100.0

应用下 看看结果 如何:

def round_up(value):
  # 替换内置round函数,实现保留2位小数的精确四舍五入
  return round(value * 100) / 100.0

print(round(1.4))

print(round(1.5))

print(round_up(1.115))

print(Decimal(1.115))

#打印结果:
1
2
1.12
1.1149999999999999911182158029987476766109466552734375

看着还不错哦,1.115 居然转化成功了.

2.decimal.Decimal

四舍五入是基于十进制的,在二进制无法精确表示的时候是会有误差的。

任何需要十进制运算的地方,都需要用 decimal.Decimal 取代 float:

from _pydecimal import Decimal, Context, ROUND_HALF_UP
print(Context(prec=3, rounding=ROUND_HALF_UP).create_decimal('1.325'))

打印结果:

1.33

自己可以试试其他的值,一定都可以进位.

通过上边的讲解 一定明白 round 本身没有问题,只是float 存储的过程有点误差.

也可以这么解释:

这不是bug,而是一种常见的舍入法,名称是“银行家式舍入法”,

用意是一半舍一半入,如果碰到0.5全入,那么银行觉得自己亏了,

银行希望和用户要风险对半。不光Python,其他的计算机语言都是这个方法,

例如C语言和Basic语言。其实不只是计算机科学,在科学实验的数据处理中,也是采用这种舍入法

推荐第二种方法, 细心的同学可以发现第一种还是不能完成达到5进,自己可以思考下

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python常用随机数与随机字符串方法实例
Apr 09 Python
Python 多线程的实例详解
Sep 07 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
Mar 13 Python
完美解决Python 2.7不能正常使用pip install的问题
Jun 12 Python
python去除拼音声调字母,替换为字母的方法
Nov 28 Python
手把手教你使用Python创建微信机器人
Apr 29 Python
Python 中Django验证码功能的实现代码
Jun 20 Python
基于Python+Appium实现京东双十一自动领金币功能
Oct 31 Python
Python 如何批量更新已安装的库
May 26 Python
python的json包位置及用法总结
Jun 21 Python
Python安装第三方库攻略(pip和Anaconda)
Oct 15 Python
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
Jun 13 Python
Python单元和文档测试实例详解
Apr 11 #Python
Python的高阶函数用法实例分析
Apr 11 #Python
Python2与Python3的区别实例分析
Apr 11 #Python
Python3获取电脑IP、主机名、Mac地址的方法示例
Apr 11 #Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 #Python
CentOS7安装Python3的教程详解
Apr 10 #Python
django富文本编辑器的实现示例
Apr 10 #Python
You might like
php图片加中文水印实现代码分享
2012/10/31 PHP
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
用prototype实现的简单小巧的多级联动菜单
2007/03/24 Javascript
JavaScript开发时的五个注意事项
2007/12/08 Javascript
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
使用documentElement正确取得当前可见区域的大小
2014/07/25 Javascript
jQuery实现简单二级下拉菜单
2015/04/12 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
2016/03/05 Javascript
requireJS使用指南
2016/04/27 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
原生JS实现Ajax跨域请求flask响应内容
2017/10/24 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
javascript实现fetch请求返回的统一拦截
2019/12/22 Javascript
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
[04:00]黄浦江畔,再会英雄——完美世界DOTA2 TI9应援视频
2019/07/31 DOTA
Python 面向对象 成员的访问约束
2008/12/23 Python
python 切片和range()用法说明
2013/03/24 Python
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
Python进行数据提取的方法总结
2016/08/22 Python
python使用super()出现错误解决办法
2017/08/14 Python
Python内置函数—vars的具体使用方法
2017/12/04 Python
Python中字符串与编码示例代码
2019/05/20 Python
使用Pandas将inf, nan转化成特定的值
2019/12/19 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
2020/01/18 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
法国最大电子商务平台:Cdiscount
2018/03/13 全球购物
六五普法规划实施方案
2014/03/21 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
小学生学习雷锋倡议书
2014/05/15 职场文书
公司员工离职证明书
2014/10/04 职场文书
见习报告的格式
2014/10/31 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书