美元金额转硬币程序计算异常:输入5.14时便士数错误
浮点数精度问题导致零钱计算错误的解决方案
你遇到的问题本质是浮点数的二进制存储精度限制——像0.1、0.05这类十进制小数,在二进制里是无限循环的,没法被精确表示。当你输入5.14时,计算机实际存储的是一个接近5.14但略小的数值(比如5.139999999999999...),经过多次减法运算后,剩余的便士部分会变成0.039999999...,除以0.01得到3.9999997,用int()直接截断就会变成3,而非预期的4。
解决办法
最可靠的方案是把金额转换成整数(以美分为单位),彻底避开浮点数运算:
amount_str = input("请输入要计算零钱的金额: ") # 拆分美元和美分部分,处理无小数点的情况 if '.' in amount_str: dollars, cents = amount_str.split('.') # 确保美分是两位,不足补0,超过则取前两位 cents = cents.ljust(2, '0')[:2] else: dollars, cents = amount_str, '00' total_cents = int(dollars) * 100 + int(cents) # 计算各硬币数量 quarters = total_cents // 25 total_cents -= quarters * 25 dimes = total_cents // 10 total_cents -= dimes * 10 nickels = total_cents // 5 total_cents -= nickels * 5 pennies = total_cents print(f'你输入的金额是 ${amount_str}') print() print(f'对应的硬币数量:') print("Quarters:", quarters) print("Dimes:", dimes) print("Nickels:", nickels) print("Pennies:", pennies)
如果不想大改代码,也可以用round()对便士的计算结果做四舍五入,但这种方法不如整数运算稳定:
# 把原来的pennies计算行改成 pennies = round(minus_nickels / 0.01)
至于输入3.14或4.14时结果正确,只是因为这些数值的浮点数误差刚好在运算中被抵消了,属于偶然情况,不能依赖。
内容的提问来源于stack exchange,提问作者xxzk21xx
相关产品推荐
相关产品推荐

