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
相关产品推荐
相关产品推荐

