免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2104 | 回复: 4
打印 上一主题 下一主题

浮点输出为3.0,整数为2 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-28 14:08 |只看该作者 |倒序浏览

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. money = float(raw_input("输入你的钱数:"))
  4. coins_25 = money // 0.25
  5. coins_10 = (money % 0.25) // 0.10
  6. coins_5 = ((money % 0.25) % 0.10) // 0.05
  7. coins_1 = ((money % 0.25) % 0.10)*100 % 5
  8. print "一分硬币数量:", coins_1
  9. print "%.2f元可以兑换成%d个25分硬币,%d个10分硬币,%d个5分硬币和%d个1分硬币" % (money,
  10.         coins_25, coins_10, coins_5, coins_1)
复制代码
>>> ================================ RESTART ================================
>>>
输入你的钱数:0.96
一分硬币数量: 1.0
0.96元可以兑换成3个25分硬币,2个10分硬币,0个5分硬币和0个1分硬币
>>> ================================ RESTART ================================
>>>
输入你的钱数:0.16
一分硬币数量: 1.0
0.16元可以兑换成0个25分硬币,1个10分硬币,1个5分硬币和1个1分硬币
>>> ================================ RESTART ================================
>>>
输入你的钱数:0.18
一分硬币数量: 3.0
0.18元可以兑换成0个25分硬币,1个10分硬币,1个5分硬币和2个1分硬币
>>> ================================ RESTART ================================

论坛徽章:
0
2 [报告]
发表于 2012-10-28 21:21 |只看该作者
回复 1# gleerat

这个问题很有趣,恐怕是浮点数求余带来的问题,有新的计算误差吧。
这样就没有问题了:
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. money = int(float(raw_input("输入你的钱数:"))*100)

  4. coins_25 = money // 25
  5. coins_10 = (money % 25) // 10
  6. coins_5 = ((money % 25) % 10) // 5
  7. coins_1 = ((money % 25) % 10) % 5
  8. print "一分硬币数量:", coins_1
  9. print "%.2f元可以兑换成%d个25分硬币,%d个10分硬币,%d个5分硬币和%d个1分硬币" % (money,
  10.                         coins_25, coins_10, coins_5, coins_1)

复制代码
结果:

%python a.py
输入你的钱数:0.18
一分硬币数量: 3
18.00元可以兑换成0个25分硬币,1个10分硬币,1个5分硬币和3个1分硬币
   

论坛徽章:
0
3 [报告]
发表于 2012-10-29 09:46 |只看该作者
回复 2# Hadron74


这样当然就绕过了我原来的问题。
不过对于coins_1,为什么int(coins_1)就会时而正常时而比float(coins_1)小1呢?
因为可能以后出了类似的问题,永远也找不到哪里出错呢。

论坛徽章:
0
4 [报告]
发表于 2012-10-29 10:34 |只看该作者
实际你的浮点数求余的结果是不足3的,转换整形自然会截掉小数,变成2了。
你可以加一行 print '%.20f' %coins_1;  就可以看到结果了。

还是尽量不要对浮点数求余,陷阱太多了。

论坛徽章:
0
5 [报告]
发表于 2012-10-29 12:12 |只看该作者
回复 4# fightlife


   
现在我也了解了,使用四舍五入来解决。
不过还是得听你的,以后取余还是转换成整数做好了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP