设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 13823|回复: 2
打印 上一主题 下一主题

请教round(2.585,2) 结果不正确

[复制链接]

9

主题

0

好友

133

积分

注册会员

Rank: 2

跳转到指定楼层
楼主
发表于 2016-10-19 15:19:25 |只看该作者 |倒序浏览
python2中round(2.585,2)的结果是2.58,有什么办法能得到正确的结果?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2016-10-20 14:01:06 |只看该作者
这是有python的浮点精度造成的。
2.585的实际值其实是
  1. >>> '%.32f' % 2.585
  2. '2.58499999999999996447286321199499'
复制代码
所以会被舍去。

如果确实对这个精度要求很高,用 decimal
  1. a = decimal.Decimal('2.585')
  2. b = a.quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_HALF_UP)
  3. print b
复制代码
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

9

主题

0

好友

133

积分

注册会员

Rank: 2

板凳
发表于 2016-10-25 08:32:33 |只看该作者
crossin先生 发表于 2016-10-20 14:01
这是有python的浮点精度造成的。
2.585的实际值其实是所以会被舍去。

后来确实使用了decimal模块,但是没有老师的简洁!
  1. def myround(num,dpnum=0):
  2.     '''
  3.     自定义的四舍五入函数,符合常识中理解的四舍五入概念,区别于round()。
  4.     num为需要四舍五入的数字,只能为int或float型数值。
  5.     dpnum为需要保留的位数,只能是大于等于0的int型数值
  6.     '''
  7.     import decimal
  8.     decimal.getcontext().rounding='ROUND_HALF_UP'
  9.     formatword='{:.'+str(dpnum)+'f}'
  10.     return float(formatword.format(decimal.Decimal(str(num))))
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-25 19:12 , Processed in 0.025712 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部