Python开发:发票与收据月付金额打印不一致问题求助
问题:订单/收据模拟程序月付款金额不一致
我正在开发一个订单/收据模拟程序,程序先打印发票,之后根据用户选择的1-4年付款计划打印收据。目前遇到的问题是,无法让发票和收据打印出相同的月付款金额。
发票部分代码
for NumYears in range (0, 4): NumYears += 1 NumPayment = NumYears * 12 FinanceFee = 39.99 * NumYears TotPrice = TotSalesPrice + FinanceFee MonPay = TotPrice / 12
发票打印输出
# Years # Payments Financing Fee Total Price Monthly Payment ---------------------------------------------------------------------- 1 12 $39.99 $9,914.99 $826.25 2 24 $79.98 $9,954.98 $829.58 3 36 $119.97 $9,994.97 $832.91 4 48 $159.96 $10,034.96 $836.25 ---------------------------------------------------------------------
收据部分代码
MonPay1 = TotPrice / 12 MonPay2 = (TotPrice / 12) * 2 MonPay3 = (TotPrice / 12) * 3 MonPay4 = (TotPrice / 12) * 4 while True: if PayMethod == "1": print("Terms: 1 Total Payments: 12") break elif PayMethod == "2": print("Terms: 2 Total Payments: 24") break elif PayMethod == "3": print("Terms: 3 Total Payments: 36") break elif PayMethod == "4": print("Terms: 4 Total Payments: 48") break while True: if PayMethod == "1": print(f"Monthly payment: {MonPay1Dsp:>10s}") break elif PayMethod == "2": print(f"Monthly payment: {MonPay2Dsp:>10s}") break elif PayMethod == "3": print(f"Monthly payment: {MonPay3Dsp:>10s}") break elif PayMethod == "4": print(f"Monthly payment: {MonPay4Dsp:>10s}") break else: break
收据打印输出
Sale price: $5,000.00 Trade Allowance: $1,000.00 Price after Trade: $4,000.00 ---------- HST: $750.00 License Fee: $75.00 Transfer Fee: $5,050.00 ---------- Total Sales Cost: $10,034.96 ---------------------------------- Terms: 1 Total Payments: 12 Monthly payment: $836.25 First payment date: 31-Jan-2022
补充计算逻辑代码
HST_FEE = .15 TRANS_FEE_LOW = 0.01 TRANS_FEE_HIGH = 0.026 LISC_FEE_LOW = 75.00 LISC_FEE_HIGH = 165.00 PriceAfterTrade = SellPrice - AmtTradeIn Taxes = HST_FEE * SellPrice if SellPrice <= 5000.00: LiscFee = LISC_FEE_LOW else: LiscFee = LISC_FEE_HIGH if SellPrice >= 20000.00: TransFee = (TRANS_FEE_HIGH * SellPrice) + SellPrice else: TransFee = (TRANS_FEE_LOW * SellPrice) + SellPrice TotSalesPrice = PriceAfterTrade + Taxes + LiscFee + TransFee
问题分析与修复方案
核心问题
- 收据端变量复用错误:发票循环结束后,
TotPrice保留的是4年计划的总金额(10034.96),收据端所有MonPay计算都基于这个值,而非对应年限的TotPrice。 - 收据端月付款逻辑错误:2/3/4年计划的月付款计算逻辑完全不符合需求,比如2年计划的月付款被错误计算为
(4年总金额/12)*2,而非(2年总金额)/12。 - 发票计算结果未存储:发票循环中计算的各年限月付款没有被保存,收据端无法调用正确数值。
修复步骤
步骤1:存储发票循环的各年限计算结果
替换原发票循环代码,把每个年限的月付款、总付款次数等数据存入字典,方便收据端调用:
# 存储各年限付款计划的计算结果 payment_plans = {} for year in range(1, 5): num_payments = year * 12 finance_fee = 39.99 * year total_price = TotSalesPrice + finance_fee monthly_pay = total_price / 12 # 对齐原发票的计算逻辑 payment_plans[str(year)] = { "num_payments": num_payments, "monthly_pay": monthly_pay }
步骤2:重构收据端的付款逻辑
删除原收据端错误的MonPay计算代码,直接从存储的字典中获取对应年限的数据:
# 处理付款计划选择并打印信息 while True: if PayMethod in payment_plans: plan = payment_plans[PayMethod] print(f"Terms: {PayMethod} Total Payments: {plan['num_payments']}") # 格式化月付款为带美元符号的字符串,保留两位小数 monthly_pay_dsp = f"${plan['monthly_pay']:,.2f}" break else: PayMethod = input("请选择1-4年的付款计划:") # 打印月付款 print(f"Monthly payment: {monthly_pay_dsp:>10s}")
步骤3:验证一致性
修复后,当用户选择1年计划时,会调用payment_plans["1"]中的月付款值(826.25),和发票输出一致;选择其他年限时,也会对应取出发票中计算的正确数值,解决金额差异问题。
额外优化建议
- 原发票循环中
NumYears +=1可简化为range(1,5),代码更简洁。 - 使用
decimal模块处理金额计算,避免浮点数精度误差。 - 合并收据端的两个
while True循环,减少冗余代码。
内容的提问来源于stack exchange,提问作者jonahpocalypse
相关产品推荐
相关产品推荐

