You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:48:10