为何我的找零计算器代码输入小数(如0.03)时无响应?
找零计算器小数金额死循环问题排查与修复
问题根源
输入0.03这类小数时代码无响应,是因为浮点数精度误差导致的死循环。十进制小数(比如0.01)无法用二进制浮点数精确存储,当你反复执行Change -= 0.01时,实际数值会出现微小偏差(例如0.03减两次0.01后,会变成类似0.009999999999999995),永远达不到Change <= 0的终止条件,循环会一直运行下去。
解决方案
最可靠的修复方式是将金额转换为整数(以分为单位),彻底规避浮点数精度问题。另外原代码的循环索引也存在小问题,一并修正。
修改后的完整代码
# 将输入金额转换为整数分,用round处理精度问题 change = int(round(float(input('Change: ')) * 100)) hundreds, fifties, twenties, tens, fives, ones = 0, 0, 0, 0, 0, 0 quarters, dimes, nickels, pennies = 0, 0, 0, 0 while change > 0: if change >= 10000: # 100元 = 10000分 hundreds += 1 change -= 10000 elif change >= 5000: # 50元 = 5000分 fifties += 1 change -= 5000 elif change >= 2000: # 20元 = 2000分 twenties += 1 change -= 2000 elif change >= 1000: # 10元 = 1000分 tens += 1 change -= 1000 elif change >= 500: # 5元 = 500分 fives += 1 change -= 500 elif change >= 100: # 1元 = 100分 ones += 1 change -= 100 elif change >= 25: # 25分 quarters += 1 change -= 25 elif change >= 10: # 10分 dimes += 1 change -= 10 elif change >= 5: # 5分 nickels += 1 change -= 5 elif change >= 1: # 1分 pennies += 1 change -= 1 currency_counts = [hundreds, fifties, twenties, tens, fives, ones, quarters, dimes, nickels, pennies] currency_names = ['Hundreds: ', 'Fifties: ', 'Twenties: ', 'Tens: ', 'Fives: ', 'Ones: ', 'Quarters: ', 'Dimes: ', 'Nickels: ', 'Pennies: '] print('') # 用zip遍历名称和数量,避免索引错误 for name, count in zip(currency_names, currency_counts): if count > 0: print(f"{name}{count}") print('')
其他可选方案(不推荐)
如果不想转换为整数,可以设置一个极小的阈值替代0作为终止条件,比如:
while True: if change <= 0.001: # 当金额小于0.001元时,视为已找零完成 break # 后续判断逻辑不变
但这种方法仍可能因浮点数误差出现异常,不如整数方案稳定。
内容的提问来源于stack exchange,提问作者Chooga S
相关产品推荐
相关产品推荐

