等额本息计算
等额本息(每月等额)还款计算
1.等额本息每个月的还的本金一样,利息递减
2.公式:本金/12 + 剩余本金 * 月利息(1%)
- Repayment.java
public class Repayment {
/**
* 当月本金
*/
private double principal;
/**
* 还款期数
*/
private int index;
/**
* 当月日期
*/
private double interest;
/**
* 还款日期
*/
private String date;
public Repayment() {
}
public Repayment(double principal, int index, double interest, String date) {
this.principal = principal;
this.index = index;
this.interest = interest;
this.date = date;
}
@Override
public String toString() {
return "Repayment{" +
"当月本金=" + principal +
", 还款期数=" + index +
", 当月利息=" + interest +
", 还款的日期='" + date + '\'' +
'}';
}
public double getPrincipal() {
return principal;
}
public void setPrincipal(double principal) {
this.principal = principal;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public double getInterest() {
return interest;
}
public void setInterest(double interest) {
this.interest = interest;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
- Financeutils.java
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* 金融工具类
*/
public class FinanceUtils {
/**
* 还款日期列表
* @param borrowDate 借款日期
* @param borrowMonth 贷款期数
* @return
*/
public static List<String> replyDateList(Date borrowDate, int borrowMonth) {
// 还款日期计算
List<String> list = new ArrayList<>();// 用来存储还款日期
// 计算未来12月的还款日期
// 把借款日期的年月日算出来 yyyy-MM-dd
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 将日期格式化为字符串
String str = sdf.format(borrowDate);
// 拆分字符串为数组
String[] strArr = str.split("-");
// 取出年月日转成int类型
int yer = Integer.parseInt(strArr[0]);// 年
int moth = Integer.parseInt(strArr[1]);// 月
int day = Integer.parseInt(strArr[2]);// 日
// 计算未来还款日期
for (int i = 0; i < borrowMonth; i++) {
// 算2月份的最大天数
Calendar cal = Calendar.getInstance();
// 设置看到月日
cal.set(yer, moth + i + 1, 1);
// 天数-1
cal.add(Calendar.DAY_OF_MONTH, -1);
// 取出日期中的年月日
int cy = cal.get(Calendar.YEAR);
int cm = cal.get(Calendar.MONTH) + 1;
int cd = cal.get(Calendar.DAY_OF_MONTH);//当月的最大天数
// 还款日默认情况下就是借款日
int repayment = day;
if (day > cd) {
repayment = cd;
}
// 拼接年月日
String repaymentDate = cy + "-" + cm + '-' + repayment;
// 添加到集合
list.add(repaymentDate);
}
return list;
}
}
- Demo2.java
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Demo2 {
public static void main(String[] args) {
/**
* 等额本息计算(按月还款-按月算)
* 等额本息(每月等额)还款计算:
* 1.等额本息每个月的还的本金一样,利息递减
* 2.公式:本金/12 + 剩余本金 * 月利息(1%)
*/
// 1.借款金额
double amount = 10000;
// 2.还款的期数
int month = 12;
// 3.计算每个月还款的本金
double mPrincipal = amount / month;
// 借款时间
Date borrowDate = new Date();
// 借款月利率(1分2)
double mRate = 0.012;
// 小数点保留2位
String s = String.format("%.2f", mPrincipal);
mPrincipal = Double.parseDouble(s);
System.out.println("借款:"+ amount);
System.out.println("借款基数:"+ month + "月");
System.out.println("每个月的平均本金:" + mPrincipal);
System.out.println("借款日期:" + borrowDate);
System.out.println("借款月利息:" + mRate);
// 4.计算未来每月还款数
List<String> dates = FinanceUtils.replyDateList(borrowDate,month);//计算好还款日期
List<Repayment> list = new ArrayList<>();
for (int i = 0; i < month; i++) {
Repayment rep = new Repayment();
// 设置还款期数
rep.setIndex(i+1);
// 设置还款日期
rep.setDate(dates.get(i));
// 设置当月的本金
if (i == month - 1) {//最后一期
double lastPrincipal = amount - (month - 1) * mPrincipal;
lastPrincipal = Double.parseDouble(String.format("%.2f",lastPrincipal));
rep.setPrincipal(lastPrincipal);
//System.out.println(lastPrincipal);
} else {
rep.setPrincipal(mPrincipal);
}
// 设置利息
// 利息:剩余本金 * 月利息(0.012)
// 剩余本金
double leftAmount = amount - mPrincipal * i;
double interest = leftAmount * 0.012;
interest = Double.parseDouble(String.format("%.2f", interest));
rep.setInterest(interest);
list.add(rep);
}
// 5.遍历
for (Repayment rep : list) {
System.out.println(rep);
}
}
}
// 打印结果
Repayment{当月本金=833.33, 还款期数=1, 当月利息=120.0, 还款的日期='2018-9-30'}
Repayment{当月本金=833.33, 还款期数=2, 当月利息=110.0, 还款的日期='2018-10-31'}
Repayment{当月本金=833.33, 还款期数=3, 当月利息=100.0, 还款的日期='2018-11-30'}
Repayment{当月本金=833.33, 还款期数=4, 当月利息=90.0, 还款的日期='2018-12-31'}
Repayment{当月本金=833.33, 还款期数=5, 当月利息=80.0, 还款的日期='2019-1-31'}
Repayment{当月本金=833.33, 还款期数=6, 当月利息=70.0, 还款的日期='2019-2-28'}
Repayment{当月本金=833.33, 还款期数=7, 当月利息=60.0, 还款的日期='2019-3-31'}
Repayment{当月本金=833.33, 还款期数=8, 当月利息=50.0, 还款的日期='2019-4-30'}
Repayment{当月本金=833.33, 还款期数=9, 当月利息=40.0, 还款的日期='2019-5-31'}
Repayment{当月本金=833.33, 还款期数=10, 当月利息=30.0, 还款的日期='2019-6-30'}
Repayment{当月本金=833.33, 还款期数=11, 当月利息=20.0, 还款的日期='2019-7-31'}
Repayment{当月本金=833.37, 还款期数=12, 当月利息=10.0, 还款的日期='2019-8-31'}