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
相关产品推荐
相关产品推荐

