Python int(input)输入浮点数报错 ATM存款功能修复方法
问题根源
你的代码报错核心是几个逻辑错误:
- 直接使用
int(input())转换用户输入时,只要输入内容是带小数点的字符串(比如45346.4),int()无法直接解析非整数字符串,会直接抛出ValueError,根本不会执行到后续的判断逻辑。 is_integer()是Python中float类型的内置方法,你将输入强转为int类型后再调用这个方法,本身就会触发属性错误,判断逻辑完全无法生效。- 额外隐患:原代码用递归调用处理输入错误的方式存在栈溢出风险,且没有修改全局
balance变量,存款操作后余额不会真正更新。
修复方法
调整输入处理逻辑:先接收输入内容转为浮点数,通过异常捕获兼容非数字输入的场景,判断浮点数是否为合法正整数后再做金额计算,用循环替代递归处理错误输入,同时正确修改全局余额变量。
修复后的完整代码如下:
def deposit(): # 声明使用全局定义的balance变量 global balance print(f'Your current balance is ${balance}\n------------------------------') print('How much money would you like to deposit?\n---------------------------\n You can only deposit in whole numbers') while True: input_val = input('Enter here:') # 捕获非数字输入的异常,避免程序崩溃 try: deposit_amount = float(input_val) except ValueError: print('----------------------------\nThat is not a valid number, please try again\n----------------------------') continue # 判断是否为正整数:金额大于0,且小数部分为0 if deposit_amount > 0 and deposit_amount.is_integer(): deposit_amount = int(deposit_amount) balance += deposit_amount print(f'Your Current Balance is ${balance}\n-------------------------------\nHave a great day!') # 若存款完成后需要直接退出程序保留quit(),否则删除即可回到上层逻辑 # quit() break else: print('----------------------------\nThat is not a whole number please try again\n----------------------------')
改动说明
- 移除了直接强转
int(input())的写法,先转成float做格式校验,同时兼容用户输入整数(比如输入100会自动转为100.0,is_integer()判断为True)和带小数的输入 - 增加
try-except异常捕获,用户输入字母、特殊符号等非数字内容时不会直接报错,会提示重新输入 - 用
while循环替代递归处理错误输入,多次输错也不会出现调用栈溢出问题 - 增加存款金额大于0的校验,避免用户输入0、负数这类无效存款金额
- 正确声明全局
balance变量,存款后余额会真实更新
内容的提问来源于stack exchange,提问作者TylerDr16
相关产品推荐
相关产品推荐

