jQuery Mortgage Amortization Calculator首月本金未扣减问题求助
问题原因
你遇到的首月余额计算异常由两个逻辑错误共同导致:
- 循环执行次数不足:当前for循环设置的条件为
i > 1,若贷款期限为n个月,循环只会执行n-1次,会漏掉最后一期还款的计算 - 余额展示时机错误:你在生成当月还款行之后才执行本金抵扣更新贷款余额,所以首月行展示的余额是未抵扣当月本金的原始贷款额,看起来就像本金到第二个月才会被扣除
修复方案
按以下逻辑调整代码即可:
- 将for循环的终止条件改为
i > 0,覆盖所有还款期 - 调整本金抵扣和行生成的逻辑顺序,直接在余额字段展示当月还款后的剩余金额
- 修正汇总行的字段对应关系,原代码存在总还款、总本金、总利息的位置错位问题
修复后核心代码
function calculate_amortization(loan_amount, monthly_mortgage, monthly_interest_rate, length_of_mortgage) { var month = parseInt($('#month').val()); var year = parseInt($('#year').val()); const DIGIT_PRECISION = 2; // 可根据实际需求调整精度值 var tableData = `<tr> <th>Month</th> <th>Payment</th> <th>Principal</th> <th>Interest</th> <th>Balance</th> </tr>`; // 初始化累计值 var total_mortgage = 0; var total_principal = 0; var total_interest = 0; // 调整循环条件,执行满length_of_mortgage次 for (i = length_of_mortgage; i > 0; i--) { var monthly_interest = parseFloat(loan_amount * monthly_interest_rate).toFixed(DIGIT_PRECISION); var monthly_principal = parseFloat(monthly_mortgage - monthly_interest).toFixed(DIGIT_PRECISION); // 提前计算当月还款后的剩余本金 var remaining_balance = parseFloat(loan_amount - monthly_principal).toFixed(DIGIT_PRECISION); // 更新累计值 total_mortgage = parseFloat(total_mortgage) + parseFloat(monthly_mortgage); total_principal = parseFloat(total_principal) + parseFloat(monthly_principal); total_interest = parseFloat(total_interest) + parseFloat(monthly_interest); var monthStr = convert_month(month); var tablerow = `<tr> <td>${monthStr} ${year}</td> <td>$${localeString(monthly_mortgage)}</td> <td>$${localeString(monthly_principal)}</td> <td>$${localeString(monthly_interest)}</td> <!-- 余额字段直接使用还款后的值 --> <td>$${localeString(remaining_balance)}</td> </tr>`; tableData = tableData + tablerow; // 更新月份 if (month == 12) { month = 1; year++; } else { month++; } // 更新贷款余额为当月还款后的值 loan_amount = remaining_balance; } // 修正汇总行的字段对应关系 tablerow = `<tr> <td></td> <td><strong>$${localeString(parseFloat(total_mortgage).toFixed(DIGIT_PRECISION))}</strong></td> <td><strong>$${localeString(parseFloat(total_principal).toFixed(DIGIT_PRECISION))}</strong></td> <td><strong>$${localeString(parseFloat(total_interest).toFixed(DIGIT_PRECISION))}</strong></td> <td></td> </tr>`; tableData = tableData + tablerow; $('h3#amortization-header').html('Amortization Schedule'); $('#total_interest').val(localeString(parseFloat(total_interest).toFixed(DIGIT_PRECISION))); $('table#amortization').html(tableData); }
内容的提问来源于stack exchange,提问作者Junky
相关产品推荐
相关产品推荐

