JAVA基础集合模拟借还款案例

等额本息计算

等额本息(每月等额)还款计算
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'}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值