Javascript中的PMT
我正在尝试编写与EXCEL PMT函数等效的代码 在JavaScript中,公式如下所示:Javascript中的PMT,javascript,jquery,javascript-framework,Javascript,Jquery,Javascript Framework,我正在尝试编写与EXCEL PMT函数等效的代码 在JavaScript中,公式如下所示: function PMT (ir, np, pv, fv ) { /* ir - interest rate per month np - number of periods (months) pv - present value fv - future value (residual value) */ pmt = ( ir * ( pv * Math.pow ( (ir+1), np )
function PMT (ir, np, pv, fv ) {
/*
ir - interest rate per month
np - number of periods (months)
pv - present value
fv - future value (residual value)
*/
pmt = ( ir * ( pv * Math.pow ( (ir+1), np ) + fv ) ) / ( ( ir + 1 ) * ( Math.pow ( (ir+1), np) -1 ) );
return pmt;
}
这对于类型为1的PMT计算非常有用(即付款发生在期初)
但是,我正在尝试为类型0场景编写代码(即付款发生在周期结束时)
有没有数学奇才可以告诉我如何修改我的公式?我不是数学天才,但一个简单的谷歌搜索就发现了这个线索: 在这里,对于type=0,他有以下公式:
pmt = ((pv - fv) * ir / (1 - (1 + ir) ^ -(np)));
也许这对你有用:)@dps123:当我最近不得不使用一些金融方程式来转换Excel工作簿中的函数时,我遇到了,它试图模仿Excel函数。如果只是看看函数的外观/工作方式与Excel类似,那么它可能值得一看 用法示例:
<?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
如果利息系数更改为(ir*类型+1)
当是到期年金意味着期初付款时,类型的1
值将确保利息系数(ir+1)
,而当是普通年金意味着期末付款时,类型的0
值将把系数降低到1
double pmt = ((pv - fv) * ir / (1 - Math.pow((1 + ir), -np)));
您给出的等式实际上是MS Excel如何计算货币的5个时间价值函数,即FV
,PV
,PMT
,NPER
和比率
。通过重新排列方程并求解FV
、PV
或PMT
,可以轻松计算前三项。对于NPER
和RATE
需要其他方法,有些方法使用二进制搜索算法来查找RATE
,但要找到RATE
的更好、优雅的解决方案,需要使用牛顿-拉斐逊方法。以下是java中的代码:
在你写公式之前,你能描述一下它们是如何工作的吗?如果不行,最好转到维基百科开始阅读;)嗨,Martin,我在JS中尝试过这个公式,但它的输出与我的公式不一样。var pmt=((100000-0)*(7.5/12)/(1-(1+(7.5/12))^-(48));var pmv=PMT2((7.5/1200),48100000,0)@dps123:其中一个使用ir=7.5/12,另一个使用7.5/1200,因此它们当然会给出不同的结果。是的。我的公式期望比率应该除以12,得到正确的值。我也改为只除以12,结果仍然不同。
double pmt = ((pv - fv) * ir / (1 - Math.pow((1 + ir), -np)));