我试图通过JavaScript中的MITx 6.00.1x解决问题集作为学习练习,试图更好地处理如何处理JS中的算法问题而不仅仅是使用框架/库和DOM操作就像我已经有一段时间了,但是在第二个问题集的第一次赋值时,我的值在for循环的第二次迭代后一直关闭。
供参考,以下是测试用例的正确值,其中余额= 42,年利率= 0.2,每月付款率= 0.04:
第1个月剩余余额:40.99
第2个月剩余余额:40.01
第3个月剩余余额:39.05
第4个月剩余余额:38.11
第5个月剩余余额:37.2
第6个月剩余余额:36.3
第7个月剩余余额:35.43
第8个月剩余余额:34.58
第9个月剩余余额:33.75
第10个月剩余余额:32.94
第11个月剩余余额:32.15
第12个月剩余余额:31.38
我从代码中获得的值是:
第1个月剩余余额:40.992
第2个月剩余余额:40.035
第3个月剩余余额:39.101
第4个月剩余余额:38.188
第5个月剩余余额:37.297
第6个月剩余余额:36.427
第7个月剩余余额:35.577
第8个月剩余余额:34.747
第9个月剩余余额:33.936
第10个月剩余余额:33.144
第11个月剩余余额:32.371
第12个月剩余余额:32.371
这是我的代码,仅供参考。
//Function calculates the amount outstanding on a loan after one year of paying the exact minimum amount, assuming compound interest
function balanceAfterYear(balance, annualInterestRate, monthlyPaymentRate) {
//Rate at which interest builds monthly
var monthlyInterest = annualInterestRate / 12.0
//The minimum monthly payment, defined by the monthly payment rate (as a decimal) multiplied by the current outstanding balance
var minPayment = monthlyPaymentRate * balance;
//The unpaid balance for a given month is equal to the previous month's balance minus the minimum monthly payment
var unpaidBalance = balance - minPayment;
//the updated balance for a given month is equal to the unpaid balance + (the unpaid balance * the monthly interest rate). Initialized at 0 here because this does not apply during month 0 which is what the above values represent.
var updatedBalance = 0;
for (var i = 1; i < 12; i++) {
minPayment = monthlyPaymentRate * unpaidBalance;
updatedBalance = unpaidBalance + (unpaidBalance * monthlyInterest);
unpaidBalance = updatedBalance - minPayment;
}
return updatedBalance.toFixed(2);
}
&#13;
我是否在我没有发现的逻辑中犯了一个基本错误?它是一个舍入问题(即在进行计算而不是仅仅在最后的帮助时舍入值)?我只是遗漏了一些关于JavaScript的基本知识,我现在应该知道吗?
我希望这不会被标记为转贴,因为我知道很多人过去曾就此任务提出类似的问题,但几乎肯定不会在js中。
感谢您抽出时间。现在感觉自己像个白痴,因为我能够在没有任何困难的情况下用Python做到这一点。
答案 0 :(得分:0)
看起来你不需要在截断时截断数字。您的银行帐户会将您的资金记录到小数点后两位。例如,在支付利息后,您的第一个月余额应为40.99美元,而不是40.992美元。截断或舍入到分。我认为每个后续月份都会增加第3个小数位引入的错误。您可能希望看到JavaScript math, round to two decimal places。
答案 1 :(得分:0)
你的算法错了。您需要做的就是扣除付款并累积利息:
function f(b, r, m) {
for (var i = 0; i < 12; i++) {
b = b*(1-m)*(1+r/12);
}
return b.toFixed(2);
}
console.log(f(42, 0.2, 0.04));
&#13;