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

CS50 Problem Set6找零硬币计算代码异常求助:每次输出0

问题排查与修正方案

你的代码输出始终为0,是因为多个逻辑错误和浮点数精度问题导致所有循环都未执行,下面逐个指出问题并给出修复方案:

1. 循环条件逻辑完全错误

所有while change % X >= X的条件永远不可能成立——取模运算的结果必然小于除数,比如change % 0.25的结果范围是[0, 0.25),不可能大于等于0.25,所以这些循环根本不会进入。应该直接判断change >= 硬币面值。

2. 硬币面值与计算错误

  • dime(10分)部分:你写的是change = change - 1,这是减了1美元而非10分,应该减0.1;还有变量名拼写错误coint应该是coin。
  • nickel(5分)部分:你把面值写成了0.5(50分),正确的nickel面值是0.05。
  • pennies(1分)部分:循环条件误用了0.1,应该判断change >= 0.01。

3. 浮点数精度隐患

用浮点数处理货币会有精度问题,比如0.1在二进制中是无限循环小数,累加或减操作后会出现类似0.009999999999999787的误差,导致循环判断失效。正确的做法是把金额转换为**整数(单位:分)**来计算。


修正后的代码

# ask the user for change owed
from cs50 import get_float
while True:
    change = get_float("Change owed:")
    if change > 0:
        break

# 转换为整数(分),避免浮点数精度问题
cents = round(change * 100)
coin = 0

# compute quarter (25分)
while cents >= 25:
    cents -= 25
    coin += 1

# compute dime (10分)
while cents >= 10:
    cents -= 10
    coin += 1

# compute nickel (5分)
while cents >= 5:
    cents -= 5
    coin += 1

# compute pennies (1分)
while cents >= 1:
    cents -= 1
    coin += 1

print(coin)

或者更高效的整除写法:

from cs50 import get_float
while True:
    change = get_float("Change owed:")
    if change > 0:
        break

cents = round(change * 100)
coin = 0

coin += cents // 25
cents %= 25

coin += cents // 10
cents %= 10

coin += cents // 5
cents %= 5

coin += cents

print(coin)

内容的提问来源于stack exchange,提问作者Balup

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:00:59