债务偿还计算器函数BUG求助:第10月AMEX异常高付款问题
债务计算器函数修复方案
问题概述
现有DEBT_CALC函数存在两个问题:
- 第10个月US Bank还清后,AMEX收到异常高额付款
additionalPayment(额外付款)功能未正确实现
规则补充:
- Snowball策略:优先偿还余额最低的债务
- Avalanche策略:优先偿还利率最高的债务
- 债务还清后,其最低还款额次月滚动应用到排序后的下一个债务
- 当月产生的超额付款需直接应用到其他未结清债务
原函数代码
function DEBT_CALC() { let debts = [ { title: "AMEX", interestRate: 0.14, minimumPayment: 52.55, balance: 510 }, { title: "Chase", interestRate: 0.19, minimumPayment: 30, balance: 900 }, { title: "US Bank", interestRate: 0.15, minimumPayment: 70, balance: 600 } ]; let debtStrategy = "avalanche"; let additionalPayment = 0; let months = 0; let totalInterestPaid = 0; let rollingMinimumPayment = 0; let overpaymentApplied = false; // Flag to track if overpayment has been applied in the current month function sortDebts() { if (debtStrategy === 'snowball') { debts.sort((a, b) => a.balance - b.balance); } else if (debtStrategy === 'avalanche') { debts.sort((a, b) => b.interestRate - a.interestRate); } } sortDebts(); console.log("Initial Debt Order: " + debts.map(debt => debt.title).join(", ")); while (debts.some(debt => debt.balance > 0)) { months++; let overpayment = 0; for (let i = 0; i < debts.length; i++) { let debt = debts[i]; if (debt.balance > 0) { let interest = debt.balance * (debt.interestRate / 12); totalInterestPaid += interest; debt.balance += interest; let payment = Math.min(debt.balance, debt.minimumPayment + additionalPayment + rollingMinimumPayment + overpayment); debt.balance -= payment; console.log(`\t Payment of $${payment.toFixed(2)} made to ${debt.title}`); if (debt.balance <= 0) { console.log(`\t\t ${debt.title} is paid off`); overpayment = (debt.minimumPayment + additionalPayment + overpayment) - payment; rollingMinimumPayment += debt.minimumPayment; debt.balance = 0; if (overpayment > 0 && !overpaymentApplied) { for (let j = 0; j < debts.length; j++) { if (debts[j].balance > 0 && debts[j].title !== debt.title) { console.log(`\t\t Overpayment of $${overpayment.toFixed(2)} from ${debt.title} applied to ${debts[j].title}`); debts[j].balance = Math.max(debts[j].balance - overpayment, 0); overpaymentApplied = true; overpayment = 0; break; } } } } else { overpayment = (debt.minimumPayment + additionalPayment + overpayment) - payment; } } if (i == debts.length - 1) { overpaymentApplied = false; // Reset the flag for the next month } } console.log(`End of Month ${months}: ` + debts.map(debt => `${debt.title} balance = $${Math.max(debt.balance, 0).toFixed(2)}`).join(", ")); } console.log(`Total Months to pay off: ${months}`); console.log(`Total Interest Paid: $${totalInterestPaid.toFixed(2)}`); }
问题原因分析
- 异常高额付款问题:
- 债务还清时,
rollingMinimumPayment被立即加到当月付款中,但规则要求该金额次月生效 - 超额付款的逻辑中,错误地将
additionalPayment重复计入,导致付款金额异常
- 债务还清时,
- 额外付款功能未实现:
- 当前逻辑将
additionalPayment加到每个债务的付款中,不符合“额外付款全部投入优先债务”的常规策略 - 未区分“每月固定额外付款”与滚动还款额的使用时机
- 当前逻辑将
修复后的函数代码
function DEBT_CALC() { let debts = [ { title: "AMEX", interestRate: 0.14, minimumPayment: 52.55, balance: 510 }, { title: "Chase", interestRate: 0.19, minimumPayment: 30, balance: 900 }, { title: "US Bank", interestRate: 0.15, minimumPayment: 70, balance: 600 } ]; let debtStrategy = "avalanche"; let additionalPayment = 0; // 可设置每月额外付款金额,例如改为50测试 let months = 0; let totalInterestPaid = 0; let rollingMinimumPayment = 0; let monthlyRollingPayment = 0; // 当月实际可用的滚动还款额(上月还清债务的最低还款额) function sortDebts() { if (debtStrategy === 'snowball') { debts.sort((a, b) => a.balance - b.balance); } else if (debtStrategy === 'avalanche') { debts.sort((a, b) => b.interestRate - a.interestRate); } } sortDebts(); console.log("Initial Debt Order: " + debts.map(debt => debt.title).join(", ")); while (debts.some(debt => debt.balance > 0)) { months++; let overpayment = 0; let hasAppliedAdditional = false; // 标记额外付款是否已使用 for (let i = 0; i < debts.length; i++) { let debt = debts[i]; if (debt.balance > 0) { // 计算当月利息并更新余额 let interest = debt.balance * (debt.interestRate / 12); totalInterestPaid += interest; debt.balance += interest; // 计算当前付款金额:优先债务可获得额外付款+滚动还款额,其他仅付最低 let paymentBase = debt.minimumPayment; if (i === 0) { // 第一个未结清债务是当前策略优先目标 paymentBase += monthlyRollingPayment; if (!hasAppliedAdditional) { paymentBase += additionalPayment; hasAppliedAdditional = true; } } // 加上之前的超额付款 let payment = Math.min(debt.balance, paymentBase + overpayment); debt.balance -= payment; console.log(`\t Payment of $${payment.toFixed(2)} made to ${debt.title}`); if (debt.balance <= 0) { console.log(`\t\t ${debt.title} is paid off`); // 计算超额付款:已付金额 = payment,原本准备付的是paymentBase + overpayment overpayment = (paymentBase + overpayment) - payment; // 记录该债务的最低还款额,次月生效 rollingMinimumPayment += debt.minimumPayment; debt.balance = 0; // 若有超额,立即应用到下一个未结清债务 if (overpayment > 0) { for (let j = i + 1; j < debts.length; j++) { if (debts[j].balance > 0) { console.log(`\t\t Overpayment of $${overpayment.toFixed(2)} from ${debt.title} applied to ${debts[j].title}`); debts[j].balance = Math.max(debts[j].balance - overpayment, 0); overpayment = 0; break; } } } } else { // 未还清,剩余的超额(如果有)留到下一个债务 overpayment = (paymentBase + overpayment) - payment; } } } // 次月生效的滚动还款额更新 monthlyRollingPayment = rollingMinimumPayment; rollingMinimumPayment = 0; // 重置,等待当月还清的债务添加 console.log(`End of Month ${months}: ` + debts.map(debt => `${debt.title} balance = $${Math.max(debt.balance, 0).toFixed(2)}`).join(", ")); } console.log(`Total Months to pay off: ${months}`); console.log(`Total Interest Paid: $${totalInterestPaid.toFixed(2)}`); }
修复说明
- 滚动还款额延迟生效:新增
monthlyRollingPayment变量,当月还清债务的最低还款额存入rollingMinimumPayment,次月才赋值给monthlyRollingPayment供使用 - 额外付款功能实现:每月额外付款仅应用到当前策略下的第一个未结清债务(优先级最高的债务),通过
hasAppliedAdditional标记确保只使用一次 - 超额付款逻辑优化:还清债务后,超额付款直接从下一个未结清债务开始应用,避免跨债务的错误重复计算
- 付款计算逻辑修正:区分优先债务与普通债务的付款构成,优先债务可获得滚动还款额+额外付款,普通债务仅付最低还款额
内容的提问来源于stack exchange,提问作者rbrooks
相关产品推荐
相关产品推荐

