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

Python实现购销合同与收发货匹配的问题排查及代码修改咨询

S&P合同与C&D记录匹配的Python实现问题

背景

  • 需求:实现购销合同(S&P合同)与实际收发货记录(C&D记录)的多维度匹配,匹配维度包含产品类型、买卖双方信息、价格、合同月份等
  • 痛点:人工匹配效率极低,现有Python脚本存在两处关键问题

现存问题

  1. 已完成匹配的合同重复参与匹配:当合同初始规模已匹配至净头寸为0时,仍会被重复纳入匹配流程。例如合同编号30831总规模6.17,已完成匹配但仍被再次匹配
  2. 数值小数部分匹配错误:匹配结果中数值整数部分正确,但小数部分常出现偏差

代码修改方向

解决已匹配合同重复匹配问题

  • 在匹配循环前添加过滤逻辑,排除净头寸为0的合同:
    # 过滤掉净头寸为0的S&P合同
    active_sp_contracts = [contract for contract in sp_contracts if contract["net_position"] != 0]
    
  • 若采用面向对象设计,可为合同类新增is_completely_matched布尔属性,匹配完成后标记为True,后续匹配遍历仅处理is_completely_matched为False的合同
  • 检查匹配完成后的状态更新代码,确保合同的净头寸或匹配状态被正确保存,不会在后续循环中被意外重置

修复小数部分匹配错误

  • 替换浮点类型为decimal.Decimal处理所有计量数值(货物量、价格等),避免二进制浮点精度误差:
    from decimal import Decimal, getcontext
    
    # 设置精度,根据业务需求调整
    getcontext().prec = 10
    # 转换数值为Decimal类型
    contract_quantity = Decimal(str(contract["quantity"]))
    cd_quantity = Decimal(str(cd_record["quantity"]))
    
  • 数值比较时避免直接使用==,改用精度阈值判断相等:
    # 设置合理的精度阈值,例如0.000001
    if abs(contract_quantity - cd_quantity) < Decimal("0.000001"):
        # 执行匹配逻辑
    
  • 检查数据读取环节,确保从数据源(如CSV、Excel)读取的小数数值被正确解析,未因类型转换丢失精度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:42:24