3

非常に正確な計算式が必要です。今のところ、私の計算式は月々の複利で月々の拠出金に対して機能しますが、月々の複利で週次の拠出金を使用する場合、式を調整する方法がわかりません。添付ファイルをダウンロードして解凍すると、計算機の動作を確認できます。

これまでのところ、これは私が Web で見つけた中で最も正確な計算機です。この計算機で生成された値と一致する Javascript 式を取得できれば幸いです。

毎週の拠出と毎月の複利の問題は、1 年が 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年、
  • 毎月の複利、

もう 1 つの計算機は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);

毎週および毎日の貢献に対して数式を機能させるにはどうすればよいですか?

4

1 に答える 1

2

ええと...これらは両方ともその計算機からわずかに外れていますが、実際にどのように行われるかについてはおそらくより正確です(ただし、実際にどのように行われるかはわかりません):

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 ) );
于 2009-04-21T20:21:00.163 に答える