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

如何处理贷款还款舍入误差:清零余额并将差额计入最后一期还款

贷款还款舍入误差修正问题

我有一笔11100.00美元的贷款,每期还款额199.19美元,利率0.192308。按要求需还款58期199.19美元,最后一期还款199.26美元,总还款额要达到11752.28美元,但我的计算结果是11752.21美元,差了0.07美元。我知道这是舍入误差导致的,但不知道怎么把差额加到最后一期里。以下是我的Pascal代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  paymentAmount, principle, theSum, theNewBalance, paidInterest, theRate : Extended;
  numberOfPays, myCnt : Integer;
begin
  myCnt := 0;
  theNewBalance := 11100.00;
  theRate := 0.192308;
  paymentAmount := 199.19;
  numberOfPays := 59;
  theSum := 0;
  principle := 0;

  ListBox1.Clear;
  ListBox1.Items.Add( 'Starting balance   :  ' + FloatToStr(theNewBalance) );

  repeat
    mycnt := mycnt + 1;

    paidInterest := theRate/100 * theNewBalance;
    principle := paymentAmount - paidInterest;
    theNewBalance := theNewBalance - principle;

    ListBox1.Items.Add( IntToStr(myCnt) + '  : ' +
      FloatToStr( SimpleRoundTo(paymentAmount,-2)) + ' : ' +
      FloatToStr(SimpleRoundTo(paidInterest,-2)) + ' : ' +
      FloatToStr(SimpleRoundTo(principle,-2)) + ' : ' +
      FloatToStr(SimpleRoundTo(theNewBalance,-2)) );

    theSum := theSum + paymentAmount;

  until (myCnt = numberOfPays) or (theNewBalance = 0.00);

  ListBox1.Items.Add( FloatToStr(theSum) );
end;

修正方案

核心思路是放弃固定最后一期还款额,改为在最后一期根据剩余余额计算实际应还金额,自动补上舍入误差。具体修改后的代码如下:

procedure TForm1.Button1Click(Sender: TObject);
var
  paymentAmount, principle, theSum, theNewBalance, paidInterest, theRate : Extended;
  numberOfPays, myCnt : Integer;
begin
  myCnt := 0;
  theNewBalance := 11100.00;
  theRate := 0.192308;
  paymentAmount := 199.19;
  numberOfPays := 59;
  theSum := 0;
  principle := 0;

  ListBox1.Clear;
  ListBox1.Items.Add( 'Starting balance   :  ' + FloatToStrF(theNewBalance, ffFixed, 10, 2) );

  repeat
    mycnt := mycnt + 1;

    // 计算当期利息
    paidInterest := theRate/100 * theNewBalance;
    
    // 最后一期调整还款额,确保剩余余额清零
    if myCnt = numberOfPays then
    begin
      paymentAmount := theNewBalance + paidInterest;
    end;

    principle := paymentAmount - paidInterest;
    theNewBalance := theNewBalance - principle;

    // 统一用FloatToStrF控制两位小数输出,避免格式混乱
    ListBox1.Items.Add( IntToStr(myCnt) + '  : ' +
      FloatToStrF(paymentAmount, ffFixed, 10, 2) + ' : ' +
      FloatToStrF(paidInterest, ffFixed, 10, 2) + ' : ' +
      FloatToStrF(principle, ffFixed, 10, 2) + ' : ' +
      FloatToStrF(theNewBalance, ffFixed, 10, 2) );

    theSum := theSum + paymentAmount;

  until (myCnt = numberOfPays) or (theNewBalance <= 0.001); // 浮点精度兼容判断

  ListBox1.Items.Add( 'Total paid: ' + FloatToStrF(theSum, ffFixed, 10, 2) );
end;

关键修改说明

  • 最后一期动态计算:当循环到最后一期时,直接将剩余本金加当期利息作为还款额,自动填补之前所有期的舍入差额,保证总还款额准确。
  • 输出格式优化:用FloatToStrF替代原代码的FloatToStr和SimpleRoundTo,精准控制输出两位小数,避免额外的舍入偏差。
  • 终止条件优化:将theNewBalance = 0.00改为theNewBalance <= 0.001,适配浮点运算的精度特性,避免因无法精确得到0导致的循环异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:55:57