2009-04-15 170 views
3

我需要一个非常准确的计算器公式。现在我的公式适用于月度复利的月度贡献,但是当您每月使用每月复利贡献时,我不知道如何调整公式。您可以通过下载并解压缩附件来查看我的计算器。如何在Javascript中准确计算每日,每周,每月复合利息?

到目前为止,我在网上找到了this is the most accurate calculator。如果我能得到一个Javascript公式来匹配这个计算器生成的值,我会很高兴。

每周捐款和每月复利的问题是,虽然一年有52周,但一些月份有5周,其他月份有4周。我不认为他们的计算器考虑到了这一点;我认为他们只是将他们的计算基于52周和每4周计算他们的兴趣。

这里是我使用的公式:

var P = startingAmount; 
var Y = yearsOfInvesting; 
var c = getAdditionalContributionsPerPeriod; 
var t = getTermsPerPeriod; 
var n = t * Y; 
var r = interestRate/100/t; // interestRate [%] 
var z = 1 + r; 
total = P * Math.pow(z, n) + c * (Math.pow(z, n + 1) - z)/r; 

鉴于

  • $ 1000个本金的情况下,
  • $每周50贡献,
  • 10年来,
  • 每月复利,

另一个计算器说total应该是30,007美元,凑整小数点。我来这是使用这个公式最接近的是本周贡献和每周复利(但我要按月复利!):

var P = 1000;//startingAmount; 
var Y = 0;//yearsOfInvesting; 
var c = 50;// 
var n = 520;//t * Y; 
var r = .02/52; 
var z = 1 + r; 

mz = P * Math.pow(z, n) + c * (Math.pow(z, n + 1) - z)/r; 
document.write(mz); 

我怎样才能让我的每日和每周的贡献公式工作?

回答

1

嗯...这两者都是稍微偏离该计算器,但可能更准确的东西实际上是如何完成的(不知道,但是,因为我不知道它是如何实际进行):

function calc(startingAmount, yearsOfInvesting, additionalContributionsPerPeriod, interestRate) { 
    var interestPerDay = (interestRate/365); 
    var total = startingAmount; 
    var date = new Date(new Date().getFullYear() + new Date().getMonth() + 1, 1); 
    var endDate = new Date(date.getFullYear() + yearsOfInvesting, date.getMonth(), date.getDate() - 1); 
    var startingWeekday = date.getDay(); 
    var startingDate = date.getDate(); 
    var runningInterest = 0; 
    while(Date.parse(date.toString()) < Date.parse(endDate.toString())) { 
     date.setDate(date.getDate() + 1); 
     runningInterest = runningInterest + total * interestPerDay; 
     if(date.getDay() == startingWeekday) { 
      total = total + additionalContributionsPerPeriod; 
     } 
     if(date.getDate() == startingDate) { 
      total = total + runningInterest; 
      runningInterest = 0; 
     } 
    } 
    total = total + runningInterest; 
    return total; 
} 
function calc2(startingAmount, yearsOfInvesting, additionalContributionsPerPeriod, interestRate) { 
    var interestPerDay = (interestRate/365); 
    var total = startingAmount; 
    var runningInterest = 0; 
    for(var day = 1; day <= 365 * yearsOfInvesting; day++) { 
     runningInterest = runningInterest + total * interestPerDay; 
     if(day % 7 == 0) { 
      total = total + additionalContributionsPerPeriod; 
     } 
     if(day % 30 == 0) { 
      total = total + runningInterest; 
      runningInterest = 0; 
     } 
    } 
    total = total + runningInterest; 
    return total; 
} 
document.write(3647 + "<br>" + calc(1000, 1, 50, 0.02) + "<br>" + calc2(1000, 1, 50, 0.02)); 
document.write("<br><br>"); 
document.write(6347 + "<br>" + calc(1000, 2, 50, 0.02) + "<br>" + calc2(1000, 2, 50, 0.02)); 
document.write("<br><br>"); 
document.write(14779 + "<br>" + calc(1000, 5, 50, 0.02) + "<br>" + calc2(1000, 5, 50, 0.02)); 
document.write("<br><br>"); 
document.write(30007 + "<br>" + calc(1000, 10, 50, 0.02) + "<br>" + calc2(1000, 10, 50, 0.02)); 
document.write("<br><br>"); 
document.write(31673 + "<br>" + calc(1000, 10, 50, 0.03) + "<br>" + calc2(1000, 10, 50, 0.03)); 
document.write("<br><br>"); 
document.write(33460 + "<br>" + calc(1000, 10, 50, 0.04) + "<br>" + calc2(1000, 10, 50, 0.04)); 
document.write("<br><br>"); 
document.write(35378 + "<br>" + calc(1000, 10, 50, 0.05) + "<br>" + calc2(1000, 10, 50, 0.05)); 
document.write("<br><br>"); 
document.write(772849953 + "<br>" + calc(1000, 55, 50, 0.20) + "<br>" + calc2(1000, 55, 50, 0.20)); 
相关问题