当前位置: 首页 > news >正文

等额本息年利率反推方法

等额本息年利率反推

  • 一、二分法
  • 二、数值逼近法

一、二分法

  • 思路:

      1. 定义初始月利率上界和下界, 取中间值
      1. 将中间值带入公式计算得出月供, 与实际月供进行比较
      1. 计算月供 < 实际月供 --> 利率偏低, 将中间值定义为新的下界, 重新计算
      1. 计算月供 > 实际月供 --> 利率偏高, 将中间值定义为新的上界, 重新计算
      1. 重复上述计算, 直至 计算月供与实际月供 的误差小于预期精度, 此时的月利率就是最终利率
  • 代码

    public static void main(String[] args) {double loanAmount = 200000;int term = 60;double yearRate = 0.0875;double monthlyPay = calcMonthlyPay(loanAmount, term, yearRate/12);//二分法double calcYearRate = calcYearRateByBinary(loanAmount, term, monthlyPay);log.info("二分法 ---> 计算年利率: {}, 实际年利率: {}", calcYearRate, yearRate);
    }/*** 等额本息反推年利率: 二分法* 时间复杂度 O(log n)* 思路: 1. 定义初始月利率上界和下界, 取中间值*      2. 将中间值带入公式计算得出月供, 与实际月供进行比较*      3. 计算月供 < 实际月供 --> 利率偏低, 将中间值定义为新的下界, 重新计算*      4. 计算月供 > 实际月供 --> 利率偏高, 将中间值定义为新的上界, 重新计算*      5. 重复上述计算, 直至 计算月供与实际月供 的误差小于预期精度, 此时的月利率就是最终利率* @param loanAmount 贷款金额* @param term 贷款期数* @param monthlyPay 实际月供* @return*/
    public static double calcYearRateByBinary(double loanAmount, int term, double monthlyPay){double mrHi = 1; //月利率上界double mrLo = 0; //月利率下界double precision = 0.000000000001; //预期精度int cnt = 200; //最高计算次数, 防止死循环int i = 0;while (i++<cnt){double mid = (mrLo + mrHi) / 2;double calcMonthlyPay = calcMonthlyPay(loanAmount, term, mid);//计算月供double diff = calcMonthlyPay - monthlyPay;if (Math.abs(diff) <= precision) {//返回年利率log.info("二分法计算次数: {}",i);return new BigDecimal(mid * 12).setScale(4, RoundingMode.HALF_UP).doubleValue();}if (diff > 0) {mrHi = mid;} else {mrLo = mid;}}throw new RuntimeException("计算了"+i+"次, 超出计算次数, 请检查计算方法");
    }/*** 等额本息计算月供* @param loanAmount 贷款金额* @param term 贷款期数* @param monthlyRate 月利率* @return*/
    public static double calcMonthlyPay(double loanAmount, int term, double monthlyRate){//每月还款金额 = 贷款金额 * 月利率 * (1+月利率)^贷款期数 / ((1+月利率)^贷款期数 - 1)double pow = Math.pow(1 + monthlyRate, term);double molecule = loanAmount * monthlyRate * pow; //分子double denominator = pow - 1; //分母//每月还款金额return molecule / denominator;
    }
    

二、数值逼近法

  • 思路:

      1. 定义初始月利率
      1. 每一步减 0.1(步长), 得出十分位的值
      1. 每一步减 0.01(步长), 得出百分位的值
      1. 每一步减 0.001(步长), 得出千分位的值
      1. 依次减下去, 直至减的值达到预期精度, 此时的月利率就是最终利率
  • 代码

    public static void main(String[] args) {double loanAmount = 200000;int term = 60;double yearRate = 0.0875;double monthlyPay = calcMonthlyPay(loanAmount, term, yearRate/12);//数值逼近法double calcYearRateApprox = calcYearRateByApprox(loanAmount, term, monthlyPay);log.info("数值逼近法 ---> 计算年利率: {}, 实际年利率: {}", calcYearRateApprox, yearRate);
    }/*** 等额本息反推年利率: 数值逼近法* 时间复杂度 O(n)* 思路: 1. 定义初始月利率*      2. 每一步减 0.1(步长), 得出十分位的值*      3. 每一步减 0.01(步长), 得出百分位的值*      4. 每一步减 0.001(步长), 得出千分位的值*      5. 依次减下去, 直至减的值达到预期精度, 此时的月利率就是最终利率* @param loanAmount 贷款金额* @param term 贷款期数* @param monthlyPay 实际月供* @return*/
    public static double calcYearRateByApprox(double loanAmount, int term, double monthlyPay){double rate = 1; //初始月利率double direction = 0.1; //方向, 决定是加 0.1, 还是减 0.1double jd = 0.1; // 加(减)步长 = direction / jddouble precision = 0.000000000001; //预期精度int cnt = 200; //最大计算次数int i = 0;while (i++ < cnt && Math.abs(direction/jd) > precision){double calcMonthlyPay = calcMonthlyPay(loanAmount, term, rate);//计算月供double diff = calcMonthlyPay - monthlyPay;if(diff * direction > 0){direction = -direction;jd*=10;}rate+=(direction/jd);}log.info("数值逼近法计算次数: {}",i);return new BigDecimal(rate * 12).setScale(4, RoundingMode.HALF_UP).doubleValue();
    }/*** 等额本息计算月供* @param loanAmount 贷款金额* @param term 贷款期数* @param monthlyRate 月利率* @return*/
    public static double calcMonthlyPay(double loanAmount, int term, double monthlyRate){//每月还款金额 = 贷款金额 * 月利率 * (1+月利率)^贷款期数 / ((1+月利率)^贷款期数 - 1)double pow = Math.pow(1 + monthlyRate, term);double molecule = loanAmount * monthlyRate * pow; //分子double denominator = pow - 1; //分母//每月还款金额return molecule / denominator;
    }
    
http://www.dtcms.com/a/415388.html

相关文章:

  • 电商网站建设需要开原网站开发
  • 网站推广服务合同中国建筑集团有限公司电话
  • 全国金融许可证失控情况数据(邮政储蓄网点 / 财务公司等)2007.7-2025.7
  • 基于STM32与influxDB的电力监控系统-5
  • 太原做app网站建设推广普通话奋进新征程宣传语
  • 【Day 65】Linux-ELK
  • 怎么免费建立自己的网站平台站长之家
  • 韩国网站购物页游最火的游戏
  • 易语言如何做验证系统官方网站推广注册app赚钱平台
  • 雅安建设机械网站百度搜索风云榜排行榜
  • 2.2 传输介质 (答案见原书 P45)
  • 做ftp网站怎么设置淘客免费交易网站建设
  • ESLint - JavaScript 代码检查工具
  • 小企业网站制作w3c网站代码标准规范
  • Jenkins 全面精通指南:从入门到脚本大师
  • 电子商务网站开发策划网页设计师属于什么部门
  • Kafka 面试题及详细答案100道(81-90)-- 高级特性与应用
  • 便捷网站建设哪家好制作网站免费
  • 蜘蛛云建站网站淘宝关键词怎么选取
  • 商务类网站哪些网络公司可以做机票预订网站
  • 【网络】测试 IP 端口连通性方法总结
  • 网站开发的总结vs2015做网站
  • 【Coze】【视频】育儿书籍工作流
  • 巫山做网站那家好银行软件开发工资一般多少
  • 计算机视觉(opencv)——基于 dlib 实现图像人脸检测
  • 电子商城网站开发价格网站开发难不难
  • Coze源码分析-资源库-删除数据库-后端源码-流程/核心技术/总结
  • 在线买房网站建设 方案做电子商务网站需要什么软件
  • 夫妻分房睡,男人忍耐得越久越暴露一个真相!别不信!
  • 《算法与数据结构》第七章[算法1]:深度优先搜索(DFS)