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

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

问题分析与修复方案

核心问题

  1. 收据端变量复用错误:发票循环结束后,TotPrice保留的是4年计划的总金额(10034.96),收据端所有MonPay计算都基于这个值,而非对应年限的TotPrice。
  2. 收据端月付款逻辑错误:2/3/4年计划的月付款计算逻辑完全不符合需求,比如2年计划的月付款被错误计算为(4年总金额/12)*2,而非(2年总金额)/12。
  3. 发票计算结果未存储:发票循环中计算的各年限月付款没有被保存,收据端无法调用正确数值。

修复步骤

步骤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:15:35