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

Python找零计算器出现不必要舍入(如0.55变0.56)问题求助

问题根源

错误核心是二进制浮点数精度丢失:Python默认float类型为IEEE 754标准的二进制浮点数,无法精确表示全部十进制小数,货币计算常用的0.1、0.01等数值都会存在微小存储误差,经过加减乘运算后误差被放大,乘以100转整数的步骤就会得到错误结果,最终导致舍入逻辑异常。
例如0.55的场景下,实际运行时change * 100的真实值可能是54.99999999999999或55.00000000000001,转int后得到54或55的错误值,后续取余、舍入结果自然不符合预期。

修复方案

方案一:以分为单位做整数运算(最简便)

全程使用整数计算,最小单位为分,完全规避浮点数精度问题:

while True:
    cost = round(float(input("请输入消费金额:")) * 100)
    payment = round(float(input("请输入支付金额:")) * 100)
    if payment >= cost:
        break
    print("余额不足")

change = payment - cost
remainder = change % 5
if remainder == 0:
    rounded = change
elif remainder in [1, 2]:
    rounded = change - remainder
elif remainder in [3, 4]:
    rounded = change + (5 - remainder)

print("消费总额   支付金额   找零金额   舍入后找零")
print("{0:.2f}         {1:.2f}          {2:.2f}         {3:.2f}".format(
    cost / 100, payment / 100, change / 100, rounded / 100
))

方案二:使用decimal模块做精确十进制运算

适用于对精度要求更高的专业货币计算场景,使用Python标准库自带的decimal模块处理十进制精确运算:

from decimal import Decimal

while True:
    cost = Decimal(input("请输入消费金额:"))
    payment = Decimal(input("请输入支付金额:"))
    if payment >= cost:
        break
    print("余额不足")

change = payment - cost
change_cents = change * Decimal('100')
remainder = int(change_cents % 5)
if remainder == 0:
    rounded_cents = change_cents
elif remainder in (1, 2):
    rounded_cents = change_cents - Decimal(remainder)
else:
    rounded_cents = change_cents + Decimal(5 - remainder)
rounded = rounded_cents / Decimal('100')

print("消费总额   支付金额   找零金额   舍入后找零")
print("{0:.2f}         {1:.2f}          {2:.2f}         {3:.2f}".format(
    cost, payment, change, rounded
))

内容的提问来源于stack exchange,提问作者testfromgod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:45:05