Python round函数小bug探讨

首先来简单介绍下round这个函数。

1. 语法

round( x [, n]  )

2. 参数

  • x -- 数值表达式。
  • n -- 数值表达式,表示从小数点位数。

3. 返回值

返回浮点数x的四舍五入值。

4. 实例

 

最近在刷NCT的PYTHON等级考试题目,在使用round这个非常不起眼的四舍五入常规函数时候发觉了一件很有意思的事情,即在某些时候.5并不会五入,反而变成了四舍。具体看下如下两个例子

在这两个例子我发觉很奇怪的现象,照道理0.5四舍五入应该是1,而2.25保留一位的四舍五入应该是2.3,而实际得到的结果与我们的数学尝试都不相符,这是为什么呢???

查阅了Python的文档后,发现这个问题其实是由Python版本所导致。这个问题只存在于Pyhon3中,而Python2中则一切正常。我们先来看下如下文档的描述。

 

在python2.7的doc中,round()的最后写着,"Values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done away from 0." 保留值将保留到离上一位更近的一端(四舍六入),如果距离两端一样远,则保留到离0远的一边。所以round(0.5)会近似到1,而round(-0.5)会近似到-1。

但是到了python3.5的doc中,文档变成了"values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice." 如果距离两边一样远,会保留到偶数的一边。比如round(0.5)和round(-0.5)都会保留到0,而round(1.5)会保留到2。

紧接着我们分别在Python2/3中做实验去验证一下

版本:Python 3.10

版本:Python 2.7

 

 

所以如果有项目是从python2.x迁移到python3.x的,可要注意一下round的地方(当然,还要注意/和//,还有print,还有一些比较另类的库)!!!!!!

基于目前存在的这种情况,尽量避免使用round函数,我通过网络整理了下如下可供大家参考

  • 使用math模块中的一些函数,比如math.ceiling(天花板除法)。
  • python自带整除,python2中是/,3中是//,还有div函数。
  • 字符串格式化可以做截断使用,例如 "%.2f" % value(保留两位小数并变成字符串……如果还想用浮点数请披上float()的外衣)。
  • 当然,对浮点数精度要求如果很高的话,请用嘚瑟馍,不对不对,请用decimal模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值