Files

3.3 KiB

利息公式重叠检测方法

问题描述

xlsx本息计算表中,同一列可能有多行利息公式。如果时间范围重叠,SUM汇总行会重复计算。

检测步骤

  1. 逐列提取所有利息公式行的时间范围:

    # 伪代码
    for col in interest_columns:
        periods = []
        for row in data_rows:
            formula = ws.cell(row, col).value
            if formula and is_interest_formula(formula):
                start_date, end_date = parse_date_range(formula)
                periods.append((row, start_date, end_date))
        # 检查重叠
        for i, (r1, s1, e1) in enumerate(periods):
            for (r2, s2, e2) in periods[i+1:]:
                if s2 < e1:  # 后一个的起始在前一个结束之前
                    print(f"OVERLAP: Row {r1} ({s1}-{e1}) and Row {r2} ({s2}-{e2})")
    
  2. 常见重叠模式:

    • 累计vs累计:D13=(A13-A9)..., D15=(A15-A9)... → D15包含D13的全部期间
    • 期间+累计混合:某行用期间公式(A13-A11),另一行用累计(A15-A9)
    • 安全模式:所有行用期间公式且首尾相连(如F列:F11从E3, F13从A11, F15从A13)

修复方法

方案A:删除中间行,保留最后的累计公式

  • 删除D13(中间累计行),D15覆盖全段
  • 适用于:中间行无扣减动作依赖该数字
  • 优点:简洁,公式少
  • 缺点:中间节点的利息数字消失,docx中不能引用

方案B:全部改为期间公式(推荐)

  • D13=(A13-A9)rateprincipal → 保留(2023-7-5到2025-1-23)
  • D15=(A15-A13)rateprincipal → 只算后半段(2025-1-23到2025-8-27)
  • 适用于:所有行都应保留(如docx需要引用中间节点的利息数字)
  • 优点:每个时间节点都有独立数字,SUM正确

选择依据

  • 如果docx正文中需要引用中间节点(如"截至2025年1月23日的利息为X元"),用方案B
  • 如果docx正文跳过中间节点直接算到暂计日,用方案A

2026-06-09 梁永案实例

原始问题

D9  = (A9-C3)*1%*12/365*C4     → 2019-1-13 到 2023-7-5 (1634天) ✓
D10 = -2,000,000                → 2023-7-5 还款
D13 = 933,698.63 (hardcoded)    → 2023-7-5 到 2025-1-23 (568天)
D15 = (A15-A9)*1%*12/365*C4    → 2023-7-5 到 2025-8-27 (784天) ← 包含D13!

D16=SUM(D4:D15) → D13和D15重叠568天,导致933,698.63元被重复计算。

修复(Doro采用方案A)

删除D13,D15覆盖全段:D16 = D9(-2M) + D15 = 686,027.40 + 1,288,767.12 = 1,974,794.52 ✓

对比:F列(无重叠,已是期间模式)

F11 = (A11-E3)...  → 2019-10-15 到 2024-4-7
F12 = -1,000,000
F13 = (A13-A11)... → 2024-4-7 到 2025-1-23  ← 从A11开始,不从E3
F15 = (A15-A13)... → 2025-1-23 到 2025-8-27 ← 从A13开始

三段首尾相连,无重叠 ✓

docx联动注意

xlsx改了利息计算结构后,docx中利息累计的表述必须与xlsx结构一致:

  • xlsx用方案A(删中间行+全段累计)→ docx直接写"自X日起至Y日止利息Z元"
  • xlsx用方案B(期间公式)→ docx可分段写每期利息再合计

⚠️ 表达清晰性:如果某个数字已经是净额(如686,027.40 = 2,686,027.40 - 2,000,000),不要在同一句中同时出现被减数和减数,否则读者无法验证算术。详见 SKILL.md "表达清晰性要求"。