|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Announcements
Chapters
Services
Feature Zones
|
IntroductionI know, this is probably not very exciting stuff, but may turn useful for some of you one day… Maybe for calculating your car / house repayments, or maybe writing a program that needs to calculate this. The basis for this set of function is derived from the Microsoft Excel formula documentation on the subject and with lots of help of our own in house “Math teacher” (thanks Andrew) we managed to put this together for the benefit of the community and as our humble contribution to the forum. Firstly – here is the Excel formula in its raw format
Now to some relevant terminology… A “loan” is made up of several elements, each playing a different role in the equation. At times, you may need to know different things about the loan; therefore I provided here several functions.
OK – enough of that blurb… here are the actual functions: double MKCalcPayment(int NumPay, double IntRate, double NPV, double FV, BOOL bStart) { IntRate /= 1200.00; double P = (- NPV * pow(1+IntRate,NumPay) + FV) / ((1 + IntRate * bStart)*((pow((1 + IntRate),NumPay) - 1) / IntRate)); return P * (-1); // Just convert it into a positive value. } double MKCalcInterest(double NumPay, double Payment, double NPV, double FV, BOOL bStart) { // Start with an arbitrary 1% Interest rate double IntRate = 1.00 / 1200.00; NPV *= (-1); double iPer = log((Payment + Payment*IntRate*bStart - FV*IntRate) / (NPV*IntRate + Payment + Payment*IntRate*bStart) ) / log (1 + IntRate); if (iPer > NumPay) { while (iPer > NumPay) { IntRate -= 0.000001; iPer = log((Payment + Payment*IntRate*bStart - FV*IntRate) / (NPV*IntRate + Payment + Payment*IntRate*bStart) ) / log (1 + IntRate); } } else { while (iPer < NumPay) { IntRate += 0.000001; iPer = log((Payment + Payment*IntRate*bStart - FV*IntRate) / (NPV*IntRate + Payment + Payment*IntRate*bStart) ) / log (1 + IntRate); } } return IntRate * 1200.00; } double MKCalcPeriods(double Payment, double IntRate, double NPV, double FV, BOOL bStart) { IntRate /= 1200.00; NPV *= (-1); return log((Payment + Payment*IntRate*bStart - FV*IntRate) / (NPV*IntRate + Payment + Payment*IntRate*bStart) ) / log (1 + IntRate); } double MKCalcResidual(double Payment, int NumPay, double IntRate, double NPV, BOOL bStart) { IntRate /= 1200.00; return -Payment * ((1 + IntRate * bStart)*((pow((1 + IntRate),NumPay) - 1) / IntRate)) + (NPV * pow(1+IntRate,NumPay)); } All of the above functions are arithmetic juggling of the original formula,
with the exception of the one named So now – lets look at some examples
Well, I am just about done, you can play with more examples – paying ahead or in arrears, with or without a residual etc.. Have fun
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||