You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

美元金额转硬币程序计算异常:输入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:45:24