问题描述
等额本息分期贷款,大多数时候借款日和还款日不一定相同(例如支付宝借呗),并且每期(每月)天数不同,比如二月份是28天,29天,其他月份有31天或者30天,此时产生的一个问题就是每期的还款日相同但是每期的天数不一定相同,用常规的等额本息还款公式计算就会有误差(因为公式中每个月的月利率是相同的),而用日利率去计算每期的利率(等额本息相当于月利率)则能达到非常精确的计算结果,并且能一并解决借款日和还款日不在同一天的问题。
前置知识
- 等额本息
等额本息百度百科 - BigDecimal类
公式推导
分析恒等式:等额本息最后一期还款后欠银行钱为0元。
已知日利率为R,本金为M,期数为N,每期天数为D1,D2…Dn(n>0),求等额本息下每期还款金额为多少?
未知设每期还款为X元。
简化 : 将1+RD1用B1代替,1+RDn就为Bn.
第N期 | 利息 | 当期本息和 | 还款后欠银行钱 | 简化同类项替换 |
---|---|---|---|---|
借款日 | 0 | 0 | M | |
1 | M * R * D1 | M(1+RD1) | M(1+RD1) - X | M*B1 - X |
2 | (M*B1 - X)R * D2 | MB1(1 + RD2) - X(RD2 + 1) | MB1(1 + RD2) - X(RD2 + 1) - X | MB1B2 - X(B2 + 1) |
n | MB1B2…Bn - X( B2B3…Bn + B3B4…Bn +… + Bn-1Bn+ Bn + 1) |
代码实现
// TODO 计算1+RD1,。。。1+RDn同类项,R为日利率,D为日期间的间隔天数,为简单期间计算similarItems过程略。
//此处数组里面写的是常量BigDecimal.valueOf(1.015),计算公式为1 + R * Dn 。
BigDecimal[] similarItems = {BigDecimal.valueOf(1.015),BigDecimal.valueOf(1.0155),BigDecimal.valueOf(1.014)};
// TODO 计算MB1B2。。。。Bn
BigDecimal polynomial1 = BigDecimal.valueOf(10000);
for (int i=0;i<similarItems.length;i++){
polynomial1 = polynomial1.multiply(similarItems[i]);
}
// TODO 计算B2B3…Bn + B3B4…Bn +… + Bn-1Bn+ Bn + 1
BigDecimal polynomial2 = BigDecimal.valueOf(1);
for (int i=0;i<similarItems.length-1;i++){
BigDecimal mult =BigDecimal.valueOf(1);
for (int j=i+1;j<similarItems.length;j++){
mult = mult.multiply(similarItems[j]);
}
polynomial2 = polynomial2.add(mult);
}
// 除法保留小数点,四舍五入规则向上取整。
BigDecimal result = polynomial1.divide(polynomial2,3, RoundingMode.HALF_UP);
答疑
如需获取通过本金,借款日期,日利率,还款日,分期数计算等额本息每期精确还款程序或者源代码.
请加微信ylp940310 。