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

利息计算存在微小差异:如何调整日计数/舍入规则以匹配预期结果?

利息计算存在微小差异:如何调整日计数/舍入规则以匹配预期结果?

你遇到的0.14差异确实来自日计数和舍入逻辑的细节,我们先拆解核心测试用例(test_tos_mi1)的数值,再给出针对性的调整方案:

问题根源分析

你的测试用例中:

  • 实际持有天数:2024-03-26到2025-03-17的天数为356天
  • 你的代码计算结果:65*100 * 6.4% * (356/365) ≈ 405.74
  • 预期结果405.6的反推:405.6 = 6500 * 6.4% * 0.975,其中0.975是356/365四舍五入到三位小数的结果

显然,测试用例采用的是先将日因子(持有天数/365)四舍五入到三位小数,再计算利息的规则,而你的代码是最后整体四舍五入到两位小数,这就是差异的来源。

针对性调整方案

修改代码,先对计算日因子做三位小数舍入,再计算最终利息:

def calculate_annual_capitalization(today: date, series: BondSeries, user_bond: Bond, nominal_value: float = 100.0,
                                    cpi_data=None):

    days_in_year = 365
    first_year_rate = series.interest_rate / 100
    issue_date = series.issue_date
    maturity_date = series.maturity_date
    purchase_date = user_bond.purchase_date
    calculation_date = min(today, maturity_date)
    value = user_bond.quantity * nominal_value
    days_held = (calculation_date - purchase_date).days
    # 先将日因子四舍五入到三位小数,再计算利息
    daily_factor = round(days_held / days_in_year, 3)
    profit = round(value * first_year_rate * daily_factor, 2)
    return profit

调整后test_tos_mi1的计算过程:

  1. 356/365 ≈ 0.97534 → 舍入到三位小数为0.975
  2. 6500 * 6.4% * 0.975 = 416 * 0.975 = 405.6
  3. 最终结果四舍五入到两位小数为405.6,完全匹配预期。

其他测试用例的适配说明

  • 对于test_tos_ma1和test_tos_ma2,调整后的代码结果仍与预期一致,因为它们的日因子舍入到三位小数后不会改变最终计算结果。
  • 对于test_tos_mi2,如果预期95.20的逻辑也是基于特定舍入规则,可以进一步调整日因子的舍入精度(比如四位小数),或者确认测试用例是否采用了其他日计数规则(比如Actual/360、每月30天等)。

额外注意事项

金融计算中的日计数规则非常多样,不同机构可能采用不同标准:

  • Actual/365 Fixed:无论是否闰年,都用365作为年天数(你的代码当前采用的规则)
  • Actual/Actual:闰年用366天,平年用365天
  • 30/360:每月按30天计算,全年固定360天
    如果后续遇到更多差异,建议确认业务场景对应的官方日计数规则。

备注:内容来源于stack exchange,提问作者LUshosiu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:09:26