天天看点

Java中利息的计算--->1.等额本息2.先息后本

整理了两种关于利息的计算(可以写成一个专门的工具类,当然小编我是入门级的选手,按照自己的思路写了一下,仅供和我 一样入门级的朋友参考):

public class MathAboutBorrow {

public static Double borrowMoney;

public static Integer month;

public static Double prate;

private static Double [] rate1 = new Double [month] ;//定义一个数组用来存周期内每个月需要还的钱

private static Double [] rate2 = new Double [month] ;

private static double amountRate1 = 0.0;//每月需还总金额

private static double amountRate2 = 0.0;//每月需还总金额

//确定还款日

public static Integer getRepayDay(){

SimpleDateFormat sdf = new SimpleDateFormat("dd");//需要得到的日期是今天在当月中的具体日期

String _repayDay = sdf.format(new Date());

int _day = Integer.parseInt(_repayDay);

Integer repayDay = null;

//根据今天的日期,判定还款日是哪一天(分为上中旬三个阶段,取中间的6号为还款日,这个可以根据自己的产品去定义合适的日期)

if(( _day <= 5 && _day > 0 ) || (_day > 25 && _day <= 31)){

repayDay = 6;

}else if(_day > 5 && _day <= 15){

repayDay = 16;

}else if(_day > 15 && _day <= 25){

repayDay = 26;

}

Integer betweenTime = repayDay - _day;

return betweenTime;

}

//先息后本每月还款的金额--->由数组记录

public static Double[] periodFristMonth(){

Integer betweenTime = getRepayDay();

Calendar calen = Calendar.getInstance();

Date date = new Date();

//先息后本的还款总金额和每月还款金额

for(int i=1;i<=month;i++){

long startDay = date.getTime();//获得现在的时间,转换成毫秒

calen.add(Calendar.MONTH, 1);//定义一个时间--->加一个月

long endDay = calen.getTime().getTime();//得到上面定义的一个月的时间的毫秒值

//得到定义的下个月的时间和现在的时间之间的差,与我们定义的还款日的差别,不到还款日默认要加上差的天数

//(借款利息在借款当天就生效,第一个月的时候不到默认还款日的时候,时间差的利息也要加上)

long days = (endDay - startDay)/3600/24/1000+betweenTime;

double periodMonth = prate*days;

rate1[i-1] = borrowMoney*periodMonth;//将这个月的利息写入数组中

calen.setTime(calen.getTime());

date = calen.getTime();

}

rate1[month-1] = rate1[month-1] + borrowMoney;//先息后本的最后一个月要将本金还上,所以最后一个月的还款为最后一个月的利息+本金

return rate1;//返回先息后本的数组

}

//先息后本的总金额计算

public static Double repayPeriodFrist(){

rate1 = periodFristMonth();

for(int i=1;i<=month;i++){

amountRate1 += rate1[i-1];

}

amountRate1 += borrowMoney;//得到先息后本的总的还款金额,先息后本最后一个月要将借款金额加上

return amountRate1;

}

//等额还款每月还款的金额--->由数组记录

public static Double[] periodSameMonth(){

Calendar calen = Calendar.getInstance();

Date date = new Date();

long rate2startDay = date.getTime();//获得现在的时间,转换成毫秒

calen.add(Calendar.MONTH, month);

long rate2endDay = calen.getTime().getTime();

long avgdays = (rate2endDay - rate2startDay)/3600/24/1000/month;

double monthPrate = prate*avgdays;

//等额本息的还款总金额和每月还款金额

for(int i=1;i<=month;i++){

double value = Math.pow((1+monthPrate),month+1);

rate2[i-1] = borrowMoney*(monthPrate*value)/(value-1);

}

return rate2;

}

//等额还款的总还款金额

public static Double repaySame(){

rate2 = periodSameMonth();

//等额本息的还款总金额和每月还款金额

for(int i=1;i<=month;i++){

amountRate2 += rate2[i-1];

}

return amountRate2;

}

}