贷款计算中的价值始终如一

时间:2017-06-01 20:16:25

标签: javascript

我试图通过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;
&#13;
&#13;

我是否在我没有发现的逻辑中犯了一个基本错误?它是一个舍入问题(即在进行计算而不是仅仅在最后的帮助时舍入值)?我只是遗漏了一些关于JavaScript的基本知识,我现在应该知道吗?

我希望这不会被标记为转贴,因为我知道很多人过去曾就此任务提出类似的问题,但几乎肯定不会在js中。

感谢您抽出时间。现在感觉自己像个白痴,因为我能够在没有任何困难的情况下用Python做到这一点。

2 个答案:

答案 0 :(得分:0)

看起来你不需要在截断时截断数字。您的银行帐户会将您的资金记录到小数点后两位。例如,在支付利息后,您的第一个月余额应为40.99美元,而不是40.992美元。截断或舍入到分。我认为每个后续月份都会增加第3个小数位引入的错误。您可能希望看到JavaScript math, round to two decimal places

答案 1 :(得分:0)

你的算法错了。您需要做的就是扣除付款并累积利息:

&#13;
&#13;
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;
&#13;
&#13;