PMT in Javascript

南楼画角 提交于 2019-12-01 06:21:00

@dps123: When I recently had to work with some financial equations to convert functions from an Excel workbook, I came across the EGM Mathematical Finance class, which tries to mimic Excel functions. It might be worth having a look at, if only to see how the functions look/were made to work like Excel's.

Example usage:

<?php
/**
 * Case use of financial class.
 * 
 * @version   $Id: financial_example.php,v 1.0.5 2004-06-23 09:03:56-05 egarcia Exp $
 * @author    Enrique Garcia M. <egarcia@egm.as>
 * @copyright (c) 2002-2004 EGM :: Ingenieria sin fronteras
 * @since     Saturday, November 30, 2002
 **/

/***************************************************************************
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 ***************************************************************************/

include('financial_class.php');

echo '<pre>';
echo 'FV: ' . $f->FV(1.1, 1/360, 0, -100) . "\n";
echo 'PV: ' . $f->PV(1.1, 1/360, 0, -100.206306226) . "\n";
echo 'PMT: ' . $f->PMT(1.1, 1/360, -100) . "\n";
echo 'PMT: ' . $f->PMT(1.1, 1/360, 0, -100.206306226) . "\n";
echo 'NPER: ' . $f->NPER(1.1, 53428.7980679, -100) . "\n";
echo 'NPER: ' . $f->NPER(1.1, 0, -100, -100.206306226) . "\n";
echo 'FV: ' . $f->FV(0.1, 1/360, 0, -100) . "\n";
echo 'PV: ' . $f->PV(0.1, 1/360, 0, -100.026478555) . "\n";
echo 'PMT: ' . $f->PMT(0.1, 1/360, -100) . "\n";
echo 'PMT: ' . $f->PMT(0.1, 1/360, 0, -100.026478555) . "\n";
echo 'NPER: ' . $f->NPER(1.1, 37776.4114948, -100) . "\n";
echo 'NPER: ' . $f->NPER(1.1, 0, -100, -100.026478555) . "\n";
echo 'EFFECT: ' . $f->EFFECT(0.0525, 4) . "\n";
echo 'NOMINAL: ' . $f->NOMINAL(0.053543, 4) . "\n";
echo 'NPV: ' . $f->NPV(0.1, array(-10000,3000,4200,6800)) . "\n";
echo 'XNPV: ' . $f->XNPV(0.09, array(-10000,2750,4250,3250,2750), array(
    mktime(0,0,0,1,1,2008),
    mktime(0,0,0,3,1,2008),
    mktime(0,0,0,10,30,2008),
    mktime(0,0,0,2,15,2009),
    mktime(0,0,0,4,1,2009),
    )) . "\n";
echo 'XIRR: ' . $f->XIRR(array(-10000,2750,4250,3250,2750), array(
    mktime(0,0,0,1,1,2008),
    mktime(0,0,0,3,1,2008),
    mktime(0,0,0,10,30,2008),
    mktime(0,0,0,2,15,2009),
    mktime(0,0,0,4,1,2009),
    ), 0.1) . "\n";
echo 'IRR: ' . $f->IRR(array(-70000,12000,15000,18000,21000)) . "\n";
echo 'DISC: ' . $f->DISC(
    mktime(0,0,0,1,25,2007),
    mktime(0,0,0,6,15,2007),
    97.975,
    100,
    0) . "\n";
echo 'DISC: ' . $f->DISC(
    mktime(0,0,0,1,25,2007),
    mktime(0,0,0,6,15,2009),
    97.975,
    100,
    1) . "\n";
echo 'DISC: ' . $f->DISC(
    mktime(0,0,0,1,25,2007),
    mktime(0,0,0,6,15,2007),
    97.975,
    100,
    2) . "\n";
echo 'DISC: ' . $f->DISC(
    mktime(0,0,0,1,25,2007),
    mktime(0,0,0,6,15,2007),
    97.975,
    100,
    3) . "\n";
echo 'DISC: ' . $f->DISC(
    mktime(0,0,0,1,25,2007),
    mktime(0,0,0,6,15,2007),
    97.975,
    100,
    4) . "\n";
echo 'INTRATE: ' . $f->INTRATE(
    mktime(0,0,0,2,15,2008),
    mktime(0,0,0,5,15,2008),
    1000000,
    1014420,
    2) . "\n";
echo 'IPMT: ' . $f->IPMT(0.1/12, 3, 3, 8000) . "\n";
echo 'IPMT: ' . $f->IPMT(0.1, 3, 3, 8000) . "\n";
echo 'RECEIVED: ' . $f->RECEIVED(
    mktime(0,0,0,2,15,2008),
    mktime(0,0,0,5,15,2008),
    1000000,
    0.0575,
    2) . "\n";
echo 'DOLLARDE: ' . $f->DOLLARDE(1.02, 16) . "\n";
echo 'DOLLARDE: ' . $f->DOLLARDE(1.1, 32) . "\n";
echo 'DOLLARFR: ' . $f->DOLLARFR(1.125, 16) . "\n";
echo 'DOLLARFR: ' . $f->DOLLARFR(1.125, 32) . "\n";
echo 'FVSCHEDULE: ' . $f->FVSCHEDULE(1, array(0.09,0.11,0.1)) . "\n";
echo 'PPMT: ' . $f->PPMT(0.1/12, 1, 2*12, 2000) . "\n";
echo 'PPMT: ' . $f->PPMT(0.08, 10, 10, 200000) . "\n";
echo 'RATE: ' . $f->RATE(4*12,-200, 8000) . "\n";
echo 'RATE: ' . $f->RATE(4*12,-200, 8000)*12 . "\n";
echo 'SYD: ' . $f->SYD(30000, 7500, 10, 10) . "\n";
echo 'SLN: ' . $f->SLN(30000, 7500, 10) . "\n";
echo 'DDB: ' . $f->DDB(1000000, 100000, 10, 4) . "\n";
echo 'DELTA: ' . $f->DELTA(5, 4) . "\n";
echo 'DELTA: ' . $f->DELTA(5, 5) . "\n";
echo 'PRICEDISC: ' . $f->PRICEDISC(mktime(0,0,0,2,16,2008), mktime(0,0,0,3,1,2008), 0.0525, 100, 2) . "\n";
echo 'YIELDDISC: ' . $f->YIELDDISC(mktime(0,0,0,2,16,2008), mktime(0,0,0,3,1,2008), 99.795, 100, 2) . "\n";
echo 'COUPNUM: ' . $f->COUPNUM(mktime(0,0,0,1,25,2007), mktime(0,0,0,11,15,2008), 2, 1) . "\n";
echo 'COUPDAYBS: ' . $f->COUPDAYBS(mktime(0,0,0,1,25,2007), mktime(0,0,0,11,17,2008), 1, 1) . "\n";
echo 'VDB: ' . $f->VDB(2400,300,10*365,0,1) . "\n";
echo 'VDB: ' . $f->VDB(2400,300,10*12,0,1) . "\n";
echo 'VDB: ' . $f->VDB(2400,300,10,0,1) . "\n";
echo 'VDB: ' . $f->VDB(2400,300,10*12,6,18) . "\n";
echo 'VDB: ' . $f->VDB(2400,300,10*12,6,18,1.5) . "\n";
echo 'VDB: ' . $f->VDB(2400,300,10,0,0.875,1.5) . "\n";
echo 'MIRR: ' . $f->MIRR(array(-120000,39000,30000,21000,37000,46000), 0.1, 0.12) . "\n";
echo 'MIRR: ' . $f->MIRR(array(-120000,39000,30000,21000), 0.1, 0.12) . "\n";
echo 'MIRR: ' . $f->MIRR(array(-120000,39000,30000,21000,37000,46000), 0.1, 0.14) . "\n";
echo '</pre>';
?>

@dps

You would need to amend the denominator where the interest factor is changed to (ir * type + 1)

When it is an annuity due meaning start of period payments the value of 1 for Type will insure the interest factor (ir + 1) and when it is an ordinary annuity meaning end of period payments the value of 0 for Type will reduce the factor to 1.

pmt = ( ir * ( pv * Math.pow ( (ir+1), np ) + fv ) ) / ( ( ir * type + 1 ) * ( Math.pow ( (ir+1), np) -1 ) );

The equation you presented is actually how MS Excel computes 5 Time Value of Money functions namely FV, PV, PMT, NPER and RATE. The first three are easily calculated by rearranging the equation and solve for FV, PV or PMT. For NPER and RATE other methods are needed, some use a binary search algorithm to find RATE yet a better and elegant solution to find RATE is to be had with Newton Raphson method.

Zulkifli fasilkom01

Below is the code in java:

double pmt = ((pv - fv) * ir / (1 - Math.pow((1 + ir), -np)));

I am not a math wiz, but a simple google search turned this thread up:

http://www.excelforum.com/excel-general/370948-pmt-function-does-anyone-know-the-formula.html

Here he has the following formula for type=0:

pmt = ((pv - fv) * ir / (1 - (1 + ir) ^ -(np)));

Maybe this will work for you :)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!