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

CS50燃油表问题:为何输入'1.5/3'这类分数会触发重新提示?

关于CS50 Fuel Gauge程序小数分数输入触发重提示的疑问

我已经通过了CS50 Fuel Gauge的所有测试用例,但有个疑问:为什么输入1.5/3或2.5/5这类带小数的分数时,程序会触发重新提示?

相关代码如下:

def main():
    percentage = -1
    while percentage == -1:
        fraction = input('Fraction: ')
        percentage = convert(fraction)
    return_val = gauge(percentage)
    print(return_val)


def convert(fraction):
    try:
        #if / not in fraction, not enough values to unpack so ValueError
        numerator, denominator = fraction.split('/')
        numerator = int(numerator)
        denominator = int(denominator)
        if numerator <= denominator and denominator != 0:
            return round((numerator/denominator)*100)
        else:
            raise ValueError
    except ValueError:
        return -1


def gauge(percentage):
    if percentage <= 1:
        return 'E'
    elif percentage >= 99:
        return 'F'
    else:
        return f'{percentage}%'

if __name__ == "__main__":
    main()

原因解析

问题出在convert函数的类型转换逻辑上:

  • 当输入1.5/3时,split('/')会得到["1.5", "3"],接着执行int(numerator)时,字符串"1.5"无法直接转换为整数,会抛出ValueError。
  • 代码中的except ValueError分支会捕获这个异常,返回-1,而main函数里的循环会因为percentage == -1成立,触发重新提示输入。

可选修改方案

如果要支持带小数的分数输入,只需把convert函数里的int转换改为float即可:

def convert(fraction):
    try:
        numerator, denominator = fraction.split('/')
        numerator = float(numerator)
        denominator = float(denominator)
        if numerator <= denominator and denominator != 0:
            return round((numerator/denominator)*100)
        else:
            raise ValueError
    except ValueError:
        return -1

修改后,1.5/3会被正确计算为50%,不会再触发重新提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 02:20:40