CS50 Pset6 Cash问题:硬币数量计算错误求助
排查CS50 Pset6 Cash题目硬币数量计算错误的问题
我来帮你拆解下代码里导致硬币数量计算不准的几个关键问题:
核心问题1:浮点数精度与类型不匹配
你把cents定义成了浮点数类型(因为dollar是get_float获取的浮点数,乘以100后还是浮点数,round(cents,2)也还是浮点数),但后续用numpy整数数组做除法和取模时,会出现精度误差。比如当输入0.1美元时,0.1 * 100实际在浮点数里是9.999999999999998,虽然你用了round,但后续的浮点数运算还是可能引入微小误差,导致除法或取模结果不符合预期。
核心问题2:错误使用浮点数除法
循环里的coins += cents / denominations[i]用的是浮点数除法(/),这会得到小数结果。比如如果cents是9.999999999,除以10会得到0.999999999,加到coins里后,最后round(coins)可能会把本该是1的结果转成0,直接导致硬币数少算。
核心问题3:没必要引入numpy
这里完全不需要用numpy数组,普通Python列表就足够了,引入numpy反而增加了类型转换的复杂度,容易出错。
修复后的代码
from cs50 import get_float while True: dollar = get_float("change owed: ") if dollar >= 0: break # 把美元转换为整数分,彻底避免浮点数精度问题 cents = int(round(dollar * 100)) coins = 0 # 用普通Python列表存储面额 denominations = [25, 10, 5, 1] for coin in denominations: # 用整数除法//计算当前面额能使用的硬币数 coins += cents // coin # 更新剩余的分 cents = cents % coin print(int(coins))
修复要点说明
- 把
cents转换为整数类型:通过int(round(dollar * 100))确保我们处理的是精确的分数量,彻底消除浮点数误差。 - 使用整数除法
//:直接得到当前面额能使用的硬币数量,结果是整数,不会有小数部分的误差。 - 移除numpy依赖:用普通列表代替numpy数组,简化代码逻辑,避免类型不匹配问题。
- 去掉多余的
round(coins):因为coins是整数累加的结果,直接转int输出即可(其实这里coins本身就是整数,直接print(coins)也可以)。
内容的提问来源于stack exchange,提问作者C.5314
相关产品推荐
相关产品推荐

