Excel中财务函数PV,PMT公式的java实现

PV 是一个财务函数,用于根据固定利率计算贷款或投资的现值。 可以将 PV 与定期付款、固定付款(如按揭或其他贷款)或投资目标的未来值结合使用。

语法

PV(rate, nper, pmt, [fv], [type])

参数

PV 函数语法具有下列参数:

  • Rate 必需。 各期利率。 例如,如果您获得年利率为 10% 的汽车贷款,并且每月还款一次,则每月的利率为 10%/12(即 0.83%)。 您需要在公式中输入 10%/12(即 0.83%)或 0.0083 作为利率。

  • Nper 必需。 年金的付款总期数。 例如,如果您获得为期四年的汽车贷款,每月还款一次,则贷款期数为 4*12(即 48)期。 您需要在公式中输入 48 作为 nper。

  • Pmt 必需。 每期的付款金额,在年金周期内不能更改。 通常,pmt 包括本金和利息,但不含其他费用或税金。 例如,对于金额为 ¥100,000、利率为 12% 的四年期汽车贷款,每月付款为 ¥2633.30。 您需要在公式中输入 -2633.30 作为 pmt。 如果省略 pmt,则必须包括 fv 参数。

  • fv 可选。 未来值,或在最后一次付款后希望得到的现金余额。 如果省略 fv,则假定其值为 0(例如,贷款的未来值是 0)。 例如,如果要在 18 年中为支付某个特殊项目而储蓄 ¥500,000,则 ¥500,000 就是未来值。 然后,您可以对利率进行保守的猜测,并确定每月必须储蓄的金额。 如果省略 fv,则必须包括 pmt 参数。

  • 类型 可选。 数字 0 或 1,用以指定各期的付款时间是在期初还是期末。

公式

Microsoft Excel 根据其他参数来求解某个金融参数。 如果 rate 不为 0,则:

如果 rate 为 0,则:

(pmt * nper) + pv + fv = 0

文档

以上是Office 的 support 文档对PV计算的部分介绍,详细可以看看Office文档

java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

package com.insurance.common.utill;

import java.math.BigDecimal;

/**
* Created by zhangzb on 2018/06/26.
*/
public class PMTUtil {

public static double pmtRoundDown(double monthRate,int periods,double amount){

double var = Math.pow(1 + monthRate,periods);
double pmtAmount = amount * (monthRate * var) / (var - 1);
return new BigDecimal(pmtAmount).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();

}


public static double pmt(double monthRate,int periods,double amount,int percise){

double var = Math.pow(1 + monthRate,periods);
double pmtAmount = amount * (monthRate * var) / (var - 1);
return new BigDecimal(pmtAmount).setScale(percise, BigDecimal.ROUND_HALF_UP).doubleValue();

}


//参考 https://support.office.com/zh-CN/article/PV-%E5%87%BD%E6%95%B0-23879D31-0E02-4321-BE01-DA16E8168CBD
public static double pv(double monthRate,int periods,double peridsAmount){

/**
* 如果年化收益率为零,monthRate作分母会出现NaN错误,需要对月利率为零进行特殊处理
*/
if (monthRate == 0){
return periods * peridsAmount;
}

double var = Math.pow(1 + monthRate,-periods);
double pvAmount = (peridsAmount - peridsAmount * var) / monthRate;
return new BigDecimal(pvAmount).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}


public static void main(String[]args){

System.out.println(pmt(0.115/12,12,10000,2));

System.out.println(PMTUtil.pv(0.08 / 12,5,662.12));

}

}

觉得有帮助就赞赏一下吧
0%