python四舍五入怎么用(python3 小数位的四舍五入用两种方法解决round 遇5不进)
python四舍五入怎么用
python3 小数位的四舍五入用两种方法解决round 遇5不进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进,自己可以思考下
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持开心学习网。
原文链接:https://blog.csdn.net/qq_34979346/article/details/83827044
- 12步轻松搞定python装饰器(Python3.5装饰器典型案例分析)
- python3 代码解读(Python3列表内置方法大全及示例代码小结)
- python简易翻译器的运行(Python3.6实现带有简单界面的有道翻译小程序)
- python实现螺旋矩阵(Python3实现的旋转矩阵图像算法示例)
- python 爬虫招聘(Python3获取拉勾网招聘信息的方法实例)
- python装饰器初学者教程(Python3.5装饰器原理及应用实例详解)
- python3 怎么查看函数用法(Python3 max函数基础用法)
- python3json序列化(Python3.5 Json与pickle实现数据序列化与反序列化操作示例)
- ubuntu python3.7安装(详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本)
- python数据分割教程(python3对拉勾数据进行可视化分析的方法详解)
- python3.7.2 详细安装教程(python3.5安装python3-tk详解)
- python3循环使用教程(Python3.5常见内置方法参数用法实例详解)
- python3正则表达式详解(Python正则表达式和re库知识点总结)
- python3安装编程环境(Python3 修改默认环境的方法)
- python中mod函数的使用方法(详解Python3中ceil函数用法)
- python处理tcp包(Python3使用TCP编写一个简易的文件下载器功能)
- 《红 雄安》系列广播剧第一集 水上奇兵雁翎队(雄安系列广播剧第一集)
- 小说 小伙穿越成刘备,用现代知识指挥作战,众谋士都看呆了(小伙穿越成刘备)
- 解析葡萄牙6-1瑞士 进攻多点开花,贡萨洛-拉莫斯一战成名(解析葡萄牙6-1瑞士)
- 这支 奇兵队 腕大 有范儿还各怀绝技,毒贩杀人犯见了都要仓皇而逃(这支奇兵队腕大)
- 雄藩崛起 奇兵队与幕末长州藩军事改革(雄藩崛起奇兵队与幕末长州藩军事改革)
- 九月初,爱如蜜糖,甜到心扉,迷恋彼此,一日不见兮,思之若狂(九月初爱如蜜糖)
热门推荐
- iis服务器的配置(win7下配置使用IIS搭建自己的WEB服务器)
- js中Math对象的用法
- sql server 报错(sql server利用不同语种语言显示报错错误消息的方法示例)
- vue 怎么设置滚动条的长度(vue使用better-scroll实现横向滚动的方法实例)
- reactnative ios(详解React Native与IOS端之间的交互)
- 使用Fiddler测试WebApi接口
- javascript编写的小游戏(CSS3 实现NES游戏机的示例代码)
- python制作彩色字符(Python3利用print输出带颜色的彩色字体示例代码)
- mysql添加数据很慢(mysql如何优化插入记录速度)
- redis的scan命令的使用(scrapy-redis源码分析之发送POST请求详解)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9