文章目录

  • 前言
  • 需求描述
  • 思路描述
  • 代码实现
    • 利率规则实体
    • 工具方法-计算第 j 阶段前(0到j-1)阶段一共几天
    • 测试方法
前言

利息计算是一种常见的需求,尤其在现在这种分期还款场景比较常见的情况下。

需求描述

用户可以分期归还利息
多期,每一期利率不同,天数不同
利息计算以本金为基准,不设置利滚利
可以设置免息日,免息日内不计算利息
第一期和免息日起始时间是同一天
对于超于最后一个利率规则的天数按照最后一个利率规则计算利息

思路描述

1、为分期利率设置数据结构,比如第几期,利率,计息天数
2、使用循环遍历的方式判断
2.1、每一期内的计息天数
2.2、每一期内的免息天数
2.3、如果是最后一期,则需要考虑多余的天数也按照这个利率进行计算

代码实现
利率规则实体
import org.apache.commons.lang.builder.ToStringBuilder;
/*** 分期利率信息实体* @author jie.wu*/
public class Rates{private int index;//第几阶段利率private int days;//本利率执行天数 比如 第1-10天,1%;第11-20天,2%;第21-30天,3%private String rates;//利率值public Rates(){}public Rates(int index,int days,String rates){this.index=index;this.days=days;this.rates=rates;}public int getIndex() {return index;}public void setIndex(int index) {this.index = index;}public int getDays() {return days;}public void setDays(int days) {this.days = days;}public String getRates() {return rates;}public void setRates(String rates) {this.rates = rates;}@Overridepublic String toString() {return ToStringBuilder.reflectionToString(this);}
}
工具方法-计算第 j 阶段前(0到j-1)阶段一共几天

比如第一阶段10天,第二阶段10天,则第三阶段这个方法返回20

/*** 计算本阶段之前一共有几天* @param j* @param ratesArray* @return*/private static int getForeDays(int j,Rates[] ratesArray){int foreDays=0;for(int i=0;i<j;i++){foreDays+=ratesArray[i].getDays();}return foreDays;}
  • 计算第 j 阶段需要计算的利息天数

需要考虑免息日的情况

/*** 计算第 j 阶段需要计算利息的天数* 对于垫资天数超过所有设定阶段天数总和的,多余的天数按照最后一个利率进行计算* @param j   第几阶段-从0计数* @param freeDays   免息日* @param fullDays   总垫资日* @param ratesArray 利率设定数组* @return */private static BigDecimal getTemDays(int j,int freeDays,int fullDays,Rates[] ratesArray){//如果是第一阶段if(j==0){//本阶段减去免息日//如果为正值则取该值//如果为负值,则本阶段不计算利息return new BigDecimal(ratesArray[j].getDays()-freeDays>0?ratesArray[j].getDays()-freeDays:0);}//如果是最后一个阶段if(j==ratesArray.length-1){//计算之前几个阶段的天数和-不包括本阶段int foreDays=getForeDays(j,ratesArray);//计算本阶段以及之后阶段免息日天数int temfreeDays=freeDays-foreDays>0?freeDays-foreDays:0;//计算本阶段垫资的天数int temDays=fullDays-foreDays>0?fullDays-foreDays:0;//将本阶段之后的天数也作为本阶段来考虑//将本阶段免息日期考虑进来temDays=temDays-temfreeDays>0?temDays-temfreeDays:0;return new BigDecimal(temDays);}else{//计算之前几个阶段的天数和-不包括本阶段int foreDays=getForeDays(j,ratesArray);//计算本阶段以及之后阶段免息日天数int temfreeDays=freeDays-foreDays>0?freeDays-foreDays:0;//计算本阶段垫资的天数int temDays=fullDays-foreDays>0?fullDays-foreDays:0;//考虑总垫资天数超过本阶段的情况,则本阶段仅取本阶段的天数if(temDays>ratesArray[j].getDays()){temDays=ratesArray[j].getDays();}//将本阶段免息日期考虑进来temDays=temDays-temfreeDays>0?temDays-temfreeDays:0;return new BigDecimal(temDays);}}
测试方法
@Testpublic void testMethod(){long beginDate=new Date().getTime();//今天距离垫资日天数int fullDays=987;//免息日为 3 天int freeDays=2;//本金BigDecimal principal=new BigDecimal("100");//分期利率规则 json 字符串String arrayStr="[{\"days\":10,\"index\":1,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":2,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":3,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":4,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":5,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":6,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":7,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":8,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":9,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":10,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":11,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":12,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":13,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":14,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":15,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":16,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":17,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":18,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":19,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":20,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":21,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":22,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":23,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":24,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":25,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":26,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":27,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":28,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":29,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":30,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":31,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":32,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":33,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":34,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":35,\"rates\":\"0.01\"},"+ "{\"days\":10,\"index\":36,\"rates\":\"0.01\"}]";//将字符串转化为 JSONArray 对象JSONArray array=JSONArray.fromObject(arrayStr);//数组长度int size=array.size();Rates[] ratesArray=new Rates[size];//按照排序将利率存放到数组for(int i=0;i<array.size();i++){Rates rates=(Rates)JSONObject.toBean((JSONObject) array.get(i),Rates.class);ratesArray[rates.getIndex()-1]=rates;}//程序运行到这里,利率已经按照先后顺序排列好了//利息总金额BigDecimal sumInterest=new BigDecimal("0");for(int j=0;j<ratesArray.length;j++){//都只计算本阶段都利率//现在是第 j 阶段System.out.print("现在是第"+j+"阶段;");//计算借款天数在本阶段借款天数-需要考虑免息日第情况//如果是最后一个利率阶段,垫资天数还在延续,则将多余天数计算到最后一个利率中BigDecimal temDays=getTemDays(j,freeDays,fullDays,ratesArray);//本阶段的利息BigDecimal temInterest=new BigDecimal("0");temInterest=new BigDecimal(ratesArray[j].getRates()).multiply(temDays).multiply(principal);System.out.println("本阶段的利息为:"+temInterest);sumInterest=sumInterest.add(temInterest);}long endDate=new Date().getTime();System.out.println("最后利息总额:"+sumInterest+";耗时:"+(endDate-beginDate));}

分期利息计算——考虑免息日期和多利率设定的思路设计和代码实现相关推荐

  1. 大数加法(ascll转换),利息计算(数组,sizeof与循环运用)

    一,大数加法 大数加法顾名思义,在超过long int 类型所承受的的较大数之间的加法运算,主流方法就是对数进行类型转换,如转换成字符串字符数组再对其依次相加,较为相识方式就是对10不断取余数,余数相 ...

  2. 24期分期免息可以提前还吗?

    用户分期付款有24期免息的优惠,那么每期就只需要归还本金,如果有提前还款的需求,可以选择提前还款.不过,由于分期付款不收取分期手续费,因此提前还款起不到减少利息的效果,提前还款其实不如按时还款划算,毕 ...

  3. 分期免息能省多少钱?

    今天想买个大件的商品,看到京东有24期免息,感觉还是很赚的,但是分期免息到底能省多少钱呢?用我小学二年级的数学水平做了一番计算,写了个程序实现了一下. # -*- coding: utf-8 -*- ...

  4. 来了!iPhone 12今晚天猫首销:12期分期免息,还送5G流量包

    今天晚上8:00点整开始,天猫正式接受用户全款预购全新 iPhone 12 与 iPhone 12 Pro 机型.iPhone 12有蓝色.绿色.黑色.白色和红色五款可选,iPhone 12 Pro提 ...

  5. 马云给20万女医护送礼物:花呗额度翻倍和3年分期免息

    3月8日消息,继给医生送奶茶,送炸鸡.送小龙虾之后,今天马云转发微博,表示要给在湖北一线的女医护群体花呗额度翻倍和3年分期免息. 按照官方公开数据进行估算,支援武汉和武汉的本地的女医护超过了20万人. ...

  6. 蚂蚁借呗总利息计算——每月等额(等额本息)

    注:花了半天研究了一下蚂蚁借呗的利息计算,起因是一次以为比较简单的计算发现借呗上实际利息比算出来的要多好几块钱,这就有点疑惑了. 说明: 特别说明的只有两点 利息分两部分:第一部分,距最近一个还款日期 ...

  7. 信用卡账单日和还款日最长最短免息期是如何计算的

    信用卡账单日和还款日 举例:华夏信用卡的持卡人 账单日是每月的8号,还款日28日 如何才能享受到最长免息期? 在账单日这天各大银行会计算账单日之前消费者的信用卡消费,计算出所有的消费总额和到期还款日的 ...

  8. 1、模拟蚂蚁借呗—利息计算

    模拟蚂蚁借呗-利息计算 程序的源代码如下: /*2017年6月11日10:15:49功能:计算蚂蚁借呗的利息缺点:本程序没有判断年份是否为闰年借款当日的时间需要手动输入,年份不能以特定的格式显示没有还 ...

  9. 我慕了!腾讯大手一挥,员工买房最高可申请免息借款90万

    近日,腾讯宣布推出安居计划Plus方案,在原安居计划借款额度基础上,新增Plus借款额度.根据方案介绍,本轮调整后,腾讯员工可从公司最高申请到90万元免息借款资金支持,用于个人工作地或社保地首套房购买 ...

最新文章

  1. 如何编写更好的SQL查询:终极指南-第二部分
  2. Python垃圾回收机制详解
  3. 怎样当一个好的面试官
  4. ZooKeeper 定位:能解决什么问题?不能解决什么问题?
  5. VTK:简单操作之DistancePointToLine
  6. 简单的jQuery扩展函数-让函数缓冲执行
  7. qt下设置按钮不接收键盘鼠标但能响应 clicked()信号
  8. pythonxml库_对python 生成拼接xml报文的示例详解
  9. 【JAVA基础篇】==、equals和hashCode的区别和联系
  10. python中factor函数_Python入门-函数
  11. python matplotlib使用ax绘图
  12. 爬了知乎 200 万数据,图说程序员都喜欢去哪儿工作
  13. 计算机启动时默认输入法设置,电脑开机输入法设置 开机默认输入法设置教程...
  14. java中继承applet类_Java - 33 Java Applet基础
  15. Python | MD5爆破及Base64/Base32爆破解密脚本
  16. Windows10 2004无线网卡电源管理消失 电源计划只有平衡
  17. WIN7 鼠标右键反应慢如何处理
  18. WEB 1.HTML
  19. android 耳机数据传输,智能手机耳机电路工作原理
  20. GEE--LandTrendr

热门文章

  1. HTML 笔记/案例
  2. 2023 诚通网盘在线解析无广告高速下载网站源码
  3. Ubuntu 22.04 桌面美化之Mac Big Sur风格
  4. US News2022世界大学排行榜!
  5. 使用微信支付接口生成支付二维码
  6. 归并排序 (递归 非递归)
  7. Matlab/Simulink中信号线拉成斜线的方法
  8. SPSS 建模数据分析实战之 银行信用评分
  9. “文心一言”和“ChatGPT”两者有何差距?
  10. 基于Web+App的快递公司物流管理信息系统设计与实现