Skip to content

Instantly share code, notes, and snippets.

@szz
Last active January 16, 2018 21:56
Show Gist options
  • Select an option

  • Save szz/b8c7c7ac16d6669aee2bf4c7ef73c3f8 to your computer and use it in GitHub Desktop.

Select an option

Save szz/b8c7c7ac16d6669aee2bf4c7ef73c3f8 to your computer and use it in GitHub Desktop.
function ppmt_sum(rate, number_of_periods, present_value, number_of_sum_period)
{
var sum = 0;
var remain_rounds = number_of_sum_period;
while (remain_rounds > 0)
{
sum += this._my_ppmt(rate, remain_rounds, number_of_periods, present_value) ;
remain_rounds--;
}
return sum;
}
//PPMT(rate, period, number_of_periods, present_value, [future_value, end_or_beginning])
function _my_ppmt(rate, period, number_of_periods, present_value, future_value, end_or_beginning)
{
if (period < 1 || (period >= number_of_periods + 1)) return null;
var pmt = this._my_pmt(rate, number_of_periods, present_value, future_value, end_or_beginning);
var ipmt = this._inner_ipmt(rate, period - 1, pmt, present_value);
return pmt - ipmt;
}
//IPMT(rate, period, number_of_periods, present_value, [future_value], [end_or_beginning])
function _my_ipmt(rate, period, number_of_periods, present_value, future_value, end_or_beginning)
{
var pmt = this._my_pmt(rate, number_of_periods, present_value, future_value, end_or_beginning);
var ppmt = this._my_ppmt(rate, period, number_of_periods, present_value, future_value, end_or_beginning);
return pmt - ppmt;
}
function _inner_ipmt(rate, period, number_of_periods, present_value)
{
var tmp = Math.pow(1 + rate, period);
return 0 - (present_value * tmp * rate + number_of_periods * (tmp - 1));
}
//PMT(rate, number_of_periods, present_value, [future_value, end_or_beginning])
function _my_pmt(rate, number_of_periods, present_value, future_value, end_or_beginning)
{
if (!future_value) future_value = 0;
if (!end_or_beginning) end_or_beginning = 0;
if (rate == 0) return -(present_value + future_value)/number_of_periods;
var pvif = Math.pow(1 + rate, number_of_periods);
var pmt = rate / (pvif - 1) * -(present_value * pvif + future_value);
if (end_or_beginning == 1) {
pmt /= (1 + rate);
};
return pmt;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment