Как точно рассчитать ежедневный, еженедельный, ежемесячный сложный процент в Javascript? - PullRequest
3 голосов
/ 16 апреля 2009

Мне нужна очень точная формула калькулятора. Сейчас моя формула работает для ежемесячных взносов с ежемесячным начислением, но когда вы используете еженедельные взносы с ежемесячным начислением, я не знаю, как изменить формулу. Вы можете увидеть мой калькулятор в действии, загрузив и распаковав вложенные файлы.

Пока что это самый точный калькулятор , который я нашел в Интернете. Я был бы счастлив, если бы мог получить формулу 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 Ответ

1 голос
/ 22 апреля 2009

Хорошо ... Оба они немного отличаются от этого калькулятора, но, возможно, более точны в отношении того, как на самом деле все делается (однако не уверен, потому что я не знаю, как это на самом деле делается):

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 ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...