Python找零计算器仅在单一硬币场景下生效的问题求助
修复你的找零计算器问题
嘿,我来帮你搞定这个找零计算器的问题!你的核心思路(用字典计数硬币)是完全没问题的,但有两个关键小坑导致它只能在单一硬币类型的场景下正常工作,咱们来逐个解决:
第一个坑:浮点数精度的隐形误差
Python里的浮点数(比如0.1)其实是二进制的近似值,不是精确的十进制表示。当你反复对浮点数做减法时,误差会慢慢累积——比如你算0.3 - 0.1 - 0.1,得到的结果可能不是0.1,而是一个接近0.1的极小值(比如0.09999999999999998),这会让程序的条件判断出错,甚至陷入死循环。
解决办法:把所有金额转换成整数分来处理!毕竟硬币的最小单位是1分,整数运算完全不会有精度问题,从根源上避免这个bug。
第二个坑:全局字典的复用问题
你把change_map定义在了函数外面,这是个全局变量。第一次调用calculator后,字典里的计数会保留下来,第二次再调用时不会重置为0,这会导致后续的计算结果完全错误。
解决办法:把字典的初始化放到calculator函数内部,每次调用函数时都生成一个全新的空计数字典。
修正后的完整代码
def calculator(change): # 每次调用函数都初始化新的硬币计数字典 change_map = {'quarter': 0, 'dime': 0, 'nickel': 0, 'penny': 0} # 把美元金额转换成整数分,用round避免浮点数转整数的误差 cents = int(round(change * 100)) while cents > 0: if cents >= 25: cents -= 25 change_map['quarter'] += 1 elif cents >= 10: cents -= 10 change_map['dime'] += 1 elif cents >= 5: cents -= 5 change_map['nickel'] += 1 elif cents >= 1: cents -= 1 change_map['penny'] += 1 print("You need the following: ") # 只打印有数量的硬币,输出更清爽 for coin, count in change_map.items(): if count > 0: print(f"{count} {coin}(s)") # 处理输入(如果用Python 2,把input改成raw_input即可) change = input("Please enter amount of change: ") change = float(change) calculator(change)
额外的小优化
- 用
round(change * 100)是为了处理类似0.07这种特殊情况:0.07 * 100的浮点数结果是6.999999999999999,转成整数会变成6,而round之后就能得到正确的7分。 - 输出时只显示有数量的硬币,避免打印0个quarter这种没用的信息。
- 适配了Python 3的
input函数(如果还在使用Python 2,改回raw_input就行)。
现在你测试一下,比如输入0.3会得到1个quarter和1个nickel,输入0.15会得到1个dime和1个nickel,各种组合都能正常工作啦!
内容的提问来源于stack exchange,提问作者Alexander Smith
相关产品推荐
相关产品推荐

