编写时间:2022-01-27

1. 函数介绍

最近有用到计算一些投资现金与未来收益的场景,产品经理使用了excel公式,我也只能找找解决方法。

参考:

  • 微软 PV函数
  • 微软 FV函数
  • 微软 PMT函数

这三个函数的计算,其实都是从一个数据公式代换来的:

2. 工具类与官方示例结果有不一样的地方

注意:下方展示的代码与excel中计算的结果相似,但是和微软的官方示例结果不同,官方示例的结果小数位不同

不同之处–1:FV函数的结果不同
① 自己的excel公式计算结果

② 官方的示例结果

不同之处–2、官方示例excel对比

PV函数与PMT函数基本一样,只有四舍五入的区别。

3. 工具类源码

   /*** PMT 是一个财务函数,用于根据固定付款额和固定利率计算贷款的付款额。** @param rate    必需。 贷款利率。* @param nper    必需。 该项贷款的付款总数。* @param pv      必需。 现值,或一系列未来付款额现在所值的总额,也叫本金。* @param fv      可选。 未来值,或在最后一次付款后希望得到的现金余额。 如果省略 fv,则假定其值为 0(零),即贷款的未来值是 0。* @param Type    可选。 0或省略-期末,1-期初* @return*/private static double PMT(double rate, double nper, double pv, double fv, double type) {if (rate == 0) {throw new RuntimeException("缺少年利率");}double pmt = (pv*Math.pow(1 + (rate / 12), nper)+fv)/((Math.pow(1 + (rate / 12), nper)-1)/(rate / 12))/(1 + (rate / 12)*type)*(-1);return new BigDecimal(pmt).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();}/***参考:https://support.microsoft.com/zh-cn/office/pv-%E5%87%BD%E6%95%B0-23879d31-0e02-4321-be01-da16e8168cbd** PV 是一个财务函数,用于根据固定利率计算贷款或投资的现值。* 可以将 PV 与定期付款、固定付款(如按揭或其他贷款)或投资目标的未来值结合使用。** @param Rate  必需。 各期利率。 例如,如果您获得年利率为 10% 的汽车贷款,并且每月还款一次,则每月的利率为 10%/12(即 0.83%)。 您需要在公式中输入 10%/12(即 0.83%)或 0.0083 作为利率。* @param Nper  必需。 年金的付款总期数。 例如,如果您获得为期四年的汽车贷款,每月还款一次,则贷款期数为 4*12(即 48)期。 您需要在公式中输入 48 作为 nper。* @param Pmt   必需。 每期的付款金额,在年金周期内不能更改。 通常,pmt 包括本金和利息,但不含其他费用或税金。 例如,对于金额为 ¥100,000、利率为 12% 的四年期汽车贷款,每月付款为 ¥2633.30。 您需要在公式中输入 -2633.30 作为 pmt。 如果省略 pmt,则必须包括 fv 参数。* @param fv    可选。 未来值,或在最后一次付款后希望得到的现金余额。 如果省略 fv,则假定其值为 0(例如,贷款的未来值是 0)。 例如,如果要在 18 年中为支付某个特殊项目而储蓄 ¥500,000,则 ¥500,000 就是未来值。 然后,您可以对利率进行保守的猜测,并确定每月必须储蓄的金额。 如果省略 fv,则必须包括 pmt 参数。* @param type  可选。 数字 0 或 1,用以指定各期的付款时间是在期初还是期末。** PS: pmt与fv至少出现一个!** @return*/public static double PV(double rate, double nper, double pmt, double fv, double type) {/*** 如果年化收益率为零,monthRate作分母会出现NaN错误,需要对年利率为零进行特殊处理*/if (rate == 0) {return nper * pmt;}double result = -(fv+pmt*(1 + (rate / 12)*type)*((Math.pow(1 + (rate / 12), nper)-1)/(rate / 12)))/Math.pow(1 + (rate / 12), nper);return new BigDecimal(result).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();}// FV(rate,nper,pmt,pv,type)/***参考:https://support.microsoft.com/zh-cn/office/fv-%E5%87%BD%E6%95%B0-2eef9f44-a084-4c61-bdd8-4fe4bb1b71b3** FV 是一个财务函数,用于根据固定利率计算投资的未来值。*    可以将 FV 与定期付款、固定付款或一次付清总额付款结合使用。** @param Rate  必需。 各期利率。年利率,月利率=年利率/12* @param Nper  必需。 年金的付款总期数。* @param Pmt   必需。 各期所应支付的金额,在整个年金期间保持不变。 通常 pmt 包括本金和利息,但不包括其他费用或税款。 如果省略 pmt,则必须包括 pv 参数。* @param pv    可选。 现值,或一系列未来付款的当前值的累积和。 如果省略 pv,则假定其值为 0(零),并且必须包括 pmt 参数。* @param type  可选。 数字 0 或 1,用以指定各期的付款时间是在期初-1还是期末-0。 如果省略 type,则假定其值为 0。** PS: pmt与fv至少出现一个!** @return*/public static double FV(double rate, double nper, double pmt, double pv, double type) {/*** 如果年化收益率为零,monthRate作分母会出现NaN错误,需要对年利率为零进行特殊处理*/if (rate == 0) {return nper * pmt;}// "1 + (rate / 12)"的nper次幂BigDecimal powers = new BigDecimal(Math.pow(1 + (rate / 12), nper));double fv = -1*(pv*powers.doubleValue()+pmt*(1 + (rate / 12)*type)*((powers.doubleValue()-1)/(rate / 12)));return new BigDecimal(fv).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();}public static void main(String[] args) {// 结果:PV:597771.46System.out.println("PV:"+PV(0.08, 240, -5000,0,0));// FV:2581.4System.out.println("FV:"+FV(0.06, 10, -200,-500,1));// 要在 18 年以后有一笔 ¥500,000 的年金,每月需存入金额。// pmt:1290.81System.out.println("pmt:"+PMT(0.06, 18*12, 0,-500000,0));// 指定参数条件下贷款的月支付额,不包括支付期限在期初的支付额。// pmt:10301.64System.out.println("pmt:"+PMT(0.08, 10, -100000,0,1));}

如有优化的地方,敬请指点!

excel中的FV函数、PMT函数与PV函数的java实现相关推荐

  1. excel中计算某年某月有多少天(函数:EOMONTH)

    excel中计算某年某月有多少天(函数:EOMONTH;DAY) 描述 函数 操作步骤 操作截图 描述 计算某年某月有多少天 函数 EOMONTH DAY 操作步骤 如果年月在A1,那么输入 =DAY ...

  2. Excel中提取英文,数值和编码(LEN函数)

    Excel中提取英文,数值和编码(LEN函数) 提取英文: 数据源中包含英文+中文,要求提取英文信息 =LEFT(A2,2*LEN(A2)-LENB(A2)) 解读:LEN函数按照字符数计算,LENB ...

  3. 计算机财务函数pmt,5个财务函数FV、PV、PMT、NPER与RATE

    <5个财务函数FV.PV.PMT.NPER与RATE>由会员分享,可在线阅读,更多相关<5个财务函数FV.PV.PMT.NPER与RATE(2页珍藏版)>请在人人文库网上搜索. ...

  4. excel中利用综合应用len(),lenb(),left() ,find()函数筛选汉字问题

    函数功能及结构介绍: 1.LEN 返回文本串的字符数. Len( text) Len(string | varname) Len 函数的语法有下面这些部分: string 任何有效的字符串表达式.如果 ...

  5. 如何在EXCEL中运行ChatGPT,从此不再需要记函数

    文章目录 目录 文章目录 序言 如果你可以直接使用chatGPT 如果你不可以直接使用chatGPT 序言 Excel是处理大量数据非常有用的工具.然而,找到并实施正确的公式有时可能是一个复杂和令人沮 ...

  6. 使用RANK函数按计算机基础的降序求名次,在EXCEL中如何利用RANK(number,ref,order)函数求名次排名...

    在EXCEL中如何利用RANK(number,ref,order)函数求名次排名 关注:234  答案:4  手机版 解决时间 2021-02-11 11:16 提问者夏日╮悲歌 2021-02-11 ...

  7. Excel中计算相隔月份的日期(EDATE函数)

    公式:EDATE(start_date, months) 1.计算2020/5/6之后2个月的日期

  8. LPR/IRR/APR/PMT/PV/FV区分,excel中PMT/PV/FV运用,等额本息/等额本金excel计算器

    一.IRR/ARR,PV/NPV/FV.PMT/PPMT/IPMT.LPR基础含义 1.LPR.IRR/ARR/EAR.APR. (1)LPR 英文释义 Loan Prime Rate,指贷款市场报价 ...

  9. Excel中ROUND、ROUNDUP、ROUNDDOWN函数详解

    在Excel中,很多时候都会用到Round函数,今天就来看下 Microsoft Excel 中 ROUND 函数.ROUNDUP函数和ROUNDDOWN函数的公式语法和用法. ROUND函数(对数值 ...

最新文章

  1. centos6.5环境DNS-本地DNS主从服务器bind的搭建
  2. 大型网站技术架构(八)网站的安全架构
  3. GridView自定义分页样式(上一页,下一页,到第几页)(新手教程)
  4. notepad++是什么?用notepad++来编辑c语言代码
  5. org.apache.hadoop.util.PlatformName //cgywin下Hadoop-0.21.0 错误问题
  6. Oracle数据块原理深入剖析
  7. 友善之臂编linux内核,友善之臂NanoPC-T3 Plus,s5p6818编译Linux内核流程
  8. 通俗易懂的来理解Iaas,Paas,SaaS
  9. nginx修改php导出时间格式,nginx 修改 time_local 时间格式
  10. 股价/期货等时间序列数据的整合检验、Grach建模
  11. JavaScript学习总结(10)——实用JS代码大全
  12. Vue中模板渲染原理
  13. 服务器装usb无线网卡,小巧便携的USB无线网卡,让台式电脑实现wifi自由
  14. IOS端好用的ssh工具推荐
  15. mysql 1556_mysqldump: Got error: 1556: You can't use locks with log tables
  16. 系列个人网站上线一周年总结
  17. [Algorithmic Toolbox学习笔记][week6]Placing Parentheses
  18. 安装perf后,执行perf命令报错。
  19. 批量挖掘SRC思路与实践一
  20. popupwindow 底部弹出+背景半透明

热门文章

  1. Flyme 9.2系统更新:适配魅族17、18、18s系列
  2. Paint the Grid Reloaded ZOJ - 3781
  3. 网络模拟http数据包
  4. 程序江湖:第四章 不识庐山真面目
  5. 数据中心配电系统4P开关的应用误区
  6. 灌装机的灌装结构设计及仿真(lunwen+任务书+开题+文综+翻译及原文+答辩PPT+cad图纸+UG模型及运动仿真)
  7. websocket-php简易聊天(保持网页数据通讯)
  8. 地磅无人值守自动称重管理系统防作弊过磅
  9. 通常计算机硬件,通常计算机硬件由输入设备、______和输出设备五部分组成
  10. html滑动解锁,js实现滑动解锁效能(PC+Moblie)