-
-
Save maarten00/23400873d51bf2ec4eeb to your computer and use it in GitHub Desktop.
| /** | |
| * Copy of Excel's PMT function. | |
| * Credit: http://stackoverflow.com/questions/2094967/excel-pmt-function-in-js | |
| * | |
| * @param rate_per_period The interest rate for the loan. | |
| * @param number_of_payments The total number of payments for the loan in months. | |
| * @param present_value The present value, or the total amount that a series of future payments is worth now; | |
| * Also known as the principal. | |
| * @param future_value The future value, or a cash balance you want to attain after the last payment is made. | |
| * If fv is omitted, it is assumed to be 0 (zero), that is, the future value of a loan is 0. | |
| * @param type Optional, defaults to 0. The number 0 (zero) or 1 and indicates when payments are due. | |
| * 0 = At the end of period | |
| * 1 = At the beginning of the period | |
| * @returns {number} | |
| */ | |
| function pmt(rate_per_period, number_of_payments, present_value, future_value, type){ | |
| future_value = typeof future_value !== 'undefined' ? future_value : 0; | |
| type = typeof type !== 'undefined' ? type : 0; | |
| if(rate_per_period != 0.0){ | |
| // Interest rate exists | |
| var q = Math.pow(1 + rate_per_period, number_of_payments); | |
| return -(rate_per_period * (future_value + (q * present_value))) / ((-1 + q) * (1 + rate_per_period * (type))); | |
| } else if(number_of_payments != 0.0){ | |
| // No interest rate, but number of payments exists | |
| return -(future_value + present_value) / number_of_payments; | |
| } | |
| return 0; | |
| } |
| /** | |
| * Copy of Excel's PMT function. | |
| * Credit: http://thoughts-of-laszlo.blogspot.nl/2012/08/complete-formula-behind-excels-pmt.html | |
| * | |
| * @param double $interest The interest rate for the loan. | |
| * @param int $num_of_payments The total number of payments for the loan in months. | |
| * @param double $PV The present value, or the total amount that a series of future payments is worth now; | |
| * Also known as the principal. | |
| * @param double $FV The future value, or a cash balance you want to attain after the last payment is made. | |
| * If fv is omitted, it is assumed to be 0 (zero), that is, the future value of a loan is 0. | |
| * @param int $Type Optional, defaults to 0. The number 0 (zero) or 1 and indicates when payments are due. | |
| * 0 = At the end of period | |
| * 1 = At the beginning of the period | |
| * | |
| * @return float | |
| */ | |
| function PMT($interest,$num_of_payments,$PV,$FV = 0.00, $Type = 0){ | |
| $xp=pow((1+$interest),$num_of_payments); | |
| return | |
| ($PV* $interest*$xp/($xp-1)+$interest/($xp-1)*$FV)* | |
| ($Type==0 ? 1 : 1/($interest+1)); | |
| } |
Works perfectly, well done
thank you. this is it.
@maarten00: Great one! Thanks for your work.
Do you know if there is an issue with the two functions and the round-options?
I do get two slightly different results in several use cases, when comparing the function's result.
Do you have any idea where that issue comes from? Probably a matter of decimal places? I'm talking about like 1 up to 3 $ difference... it's not much, but still, it seems to be a different value.
Thanks for your feedback.
@maarten00: Great one! Thanks for your work.
Do you know if there is an issue with the two functions and the round-options?
I do get two slightly different results in several use cases, when comparing the function's result.Do you have any idea where that issue comes from? Probably a matter of decimal places? I'm talking about like 1 up to 3 $ difference... it's not much, but still, it seems to be a different value.
Thanks for your feedback.
I have experienced some very slight differences in the output when comparing it to the output from Excel. In my case the differnce was negligible because I was only displaying prices rounded to 2 decimals. I don't remember if I looked into the issue or not, but I did add the original links where I found the code. Maybe someone there had the same issue and added an updated version :)
http://stackoverflow.com/questions/2094967/excel-pmt-function-in-js
http://thoughts-of-laszlo.blogspot.nl/2012/08/complete-formula-behind-excels-pmt.html
This just saved me a lot of time. Thanks Man
for pmt.js - line 23, you are dividing the number with base using variable type, and type by default is 0 which lead to number/0 and become infinity number. It looks like a different formula between js and php.
Hi!
This function is great, thank you!
I am comparing this to a function in an excel sheet, and it seems like if the fv is not 0, the results differ from excel and this function.
Do you know what causes this?
Example:
Formula Excel
r 0 0
n 10 10
pv 8000 8000
fv 1000 1000
type 0 0
Result -900 700
If fv is 0:
Result -800 800
Thank you very much.
This's key of my project. ><!