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"htmlcode">
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进,自己可以思考下
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。