package annotation.test; import javax.swing.JOptionPane; public class FangDaiJiSuanQi { private double lilv; // 贷款利率 private double benjin; // 贷款额度,单位 万 private int nian; // 还款年限 private double yuehuankuan; // 每月还款 private double zonge; // 还款总额 private double yuehuankuan_benjin; // 每月还款的本金 private double yuehuankuan_lixi; // 每月还款的利息 private double yuejianshao ; // 等额本金方式月减少的还款额 private double lessbenjin; // 尚未归还的本金 public FangDaiJiSuanQi(double lilv , double benjin , int nian ){ this.lilv = lilv; this.benjin = benjin; this.nian = nian; } public static void main (String[] args) { // 商贷利率 5.4 , 贷款 30 万, 准备贷款 20 年 FangDaiJiSuanQi fd = new FangDaiJiSuanQi(5.4, 30.0, 20); // 第一种用法: 等额本金的计算 // for(int i = 0 ; i < fd.nian * 12 ; i++) { // fd.dengebenjin(fd.lilv, fd.benjin, fd.nian, i+1); // System.out.println("第 " + (i + 1) + " 个月*************"); // System.out.print(" 月还款额:" + fd.yuehuankuan); // System.out.print(" 月还款额本金:" + fd.yuehuankuan_benjin); // System.out.print(" 月还款额利息:" + fd.yuehuankuan_lixi); // System.out.print(" 月还款额减少:" + fd.yuejianshao); // System.out.println(); // } // 计算还款的总数 1 是等额本息 2 是等额本金 // fd.countZongE(fd.lilv, fd.benjin, fd.nian, "2"); // System.out.println("总额: "+fd.zonge); // // 第二种用法 // 等额本息的计算 // for(int i = 0 ; i < fd.nian * 12 ; i++) { // fd.dengebenxi(fd.lilv, fd.benjin, fd.nian, i + 1); // System.out.println("第 " + (i + 1) + " 个月*************"); // System.out.print(" 月还款额:" + fd.yuehuankuan); // System.out.print(" 月还款额本金:" + fd.yuehuankuan_benjin); // System.out.print(" 月还款额利息:" + fd.yuehuankuan_lixi); // System.out.println(); // } // // 计算还款的总数 1 是等额本息 2 是等额本金 // fd.countZongE(fd.lilv, fd.benjin, fd.nian, "1"); // System.out.println("总额: "+fd.zonge); // 第三种用法 计划贷款 11 - 20 年之间 , 计划在第 5 - 8 年之间提前一次性付清 // fd.bijiao(fd,11,20,5,8); } // 等额本金的计算方式,计算值 。 需输入 利率、本金、 贷款年份、 需计算的月份, 未归还本金为截止本月之前的统计,不包括本月 public void dengebenjin(double lilv, double benjin, int nian, int yuefen){ benjin = benjin * 10000 ; yuehuankuan_benjin = benjin / ( nian * 12 ) ; // 月还款中的本金部分 double yihuankuanedu = yuehuankuan_benjin * (yuefen - 1); // 计算已还款的本金 yuehuankuan_lixi = ( benjin - yihuankuanedu ) * ( lilv/100/12 ); // 月还款中的利息部分 yuejianshao = yuehuankuan_benjin * ( lilv/100/12 ); // 每月减少的额度 yuehuankuan = yuehuankuan_benjin + yuehuankuan_lixi ; // 月还款 lessbenjin = benjin - yuehuankuan_benjin * (yuefen - 1); // 尚未归还本金 } // 计算还款的总数 1 是等额本息 2 是等额本金 public void countZongE(double lilv, double benjin, int nian, String type){ double zonge = 0; if ( "1".equals(type) ){ for(int i = 0 ; i < nian * 12 ; i++) { dengebenxi(lilv, benjin, nian, i + 1); zonge += yuehuankuan; } }else{ // 等额本金 for(int i = 0 ; i < nian * 12 ; i++) { dengebenjin( lilv, benjin, nian, i + 1); zonge += yuehuankuan; } } this.zonge = zonge ; } // 等额本息,计算每个月的还款额度 public void dengebenxi(double lilv, double benjin, int nian, int yuefen){ double yuelilv = lilv /100/ 12; // 月利率 benjin = benjin * 10000; // 本金 yuehuankuan = ( benjin * yuelilv * Math.pow((1+yuelilv), nian * 12) ) / (Math.pow(1+yuelilv, nian * 12) -1 ) ; yuehuankuan_lixi = (benjin * yuelilv - yuehuankuan) * Math.pow(1+yuelilv, yuefen - 1) + yuehuankuan; yuehuankuan_benjin = yuehuankuan - yuehuankuan_lixi ; } /** * * 推荐还款的比较方式 * fd 记录了本机借贷的信息,其中借贷年数以 minian 和 maxnian 为准,除非 这两个字段为空 * minHuan 为还款的起始年数 * maxHuan 为最终的还款年数 * * 本方法实现的是提前一次性付清,那么在什么样的时间点一次性付清是最有利的。也就是还款总数最少的。建议把结构放在excel中,看起来会更方便。 */ public void bijiao(FangDaiJiSuanQi fd, int minian , int maxnian, int minHuan, int maxHuan){ // 借贷年数 int nian = fd.nian; if(minian == 0 || maxnian == 0){ minian = fd.nian ; maxnian = fd.nian ; } // 还款的月份 if(minHuan == 0 || maxHuan == 0){ minHuan = 1; maxHuan = maxnian * 12; } int minHuanYue , maxHuanYue = 0; minHuanYue = (minHuan-1) * 12 + 1; maxHuanYue = maxHuan * 12; double yiHuanBenJin = 0; double yiHuanLiXi = 0; double yiHuanZongE = 0; double shengYuBenJi = 0; double yiCiXing = 0; // 计算等额本息 for( int year = minian ; year <= maxnian ; year ++ ){ System.out.println("借贷年限为:"+year+"年!\t"+"借贷"+fd.benjin+"万元"); System.out.println("提前还款年份\t"+"月份\t"+"还款方式\t"+"已还总额\t"+"已还本金\t"+"已还利息\t"+"剩余本金\t"+"总共缴纳\t"+"还款方式\t"+"已还总额\t"+"已还本金\t"+"已还利息\t"+"剩余本金\t"+"总共缴纳"); for( int i = minHuanYue ; i<= maxHuanYue ; i ++ ){ yiHuanBenJin = 0; yiHuanLiXi = 0; yiHuanZongE = 0; shengYuBenJi = 0; yiCiXing = 0; // 等额本息的方式计算 for (int j = 1 ; j < i ; j ++ ){ dengebenxi(fd.lilv, fd.benjin, year, j); yiHuanZongE += yuehuankuan; yiHuanBenJin += yuehuankuan_benjin; yiHuanLiXi += yuehuankuan_lixi ; } shengYuBenJi = fd.benjin * 10000 - yiHuanBenJin ; yiCiXing = shengYuBenJi + yiHuanZongE ; System.out.print("第"+(i%12==0?i/12:i/12+1) +"年\t"); System.out.print("第"+(i%12==0?12:i%12)+"月\t"+"等额本息\t"+yiHuanZongE+"\t"+yiHuanBenJin+"\t"+yiHuanLiXi+"\t"+shengYuBenJi+"\t"+yiCiXing+"\t"); yiHuanBenJin = 0; yiHuanLiXi = 0; yiHuanZongE = 0; shengYuBenJi = 0; yiCiXing = 0; // 等额本金的方式计算 for (int j = 1 ; j < i ; j ++ ){ dengebenjin(fd.lilv, fd.benjin, year, j); yiHuanZongE += yuehuankuan; yiHuanBenJin += yuehuankuan_benjin; yiHuanLiXi += yuehuankuan_lixi ; } shengYuBenJi = fd.benjin * 10000 - yiHuanBenJin ; yiCiXing = shengYuBenJi + yiHuanZongE ; System.out.println("等额本金\t"+yiHuanZongE+"\t"+yiHuanBenJin+"\t"+yiHuanLiXi+"\t"+shengYuBenJi+"\t"+yiCiXing); } } } }