java中每月等额与先息后本计算
一般信用贷款会提供两种还款方式:每月等额或者先息后本。每月等额,就是每月归还等同的部分本金和利息,你手里在使用的本金其实是逐月减少的。先息后本就是先还利息,到期归还本金。
每月等额
importjava.math.BigDecimal; importjava.util.Calendar; importjava.util.Date; /** *Title:等额本息还款工具类
* */ publicclassCPMUtils{ /** *Description:每月还款总额。〔贷款本金×月利率×(1+月利率)^还款月数〕÷〔(1+月利率)^还款月数-1〕
*@paramprincipal贷款本金 *@parammonthlyInterestRate月利率 *@paramamount期数 *@return */ publicstaticBigDecimalmonthlyRepayment(BigDecimalprincipal,BigDecimalmonthlyInterestRate,intamount){ //(1+月利率)^还款月数 BigDecimaltemp=monthlyInterestRate.add(MoneyUtils.ONE).pow(amount); returnprincipal.multiply(monthlyInterestRate) .multiply(temp) .divide(temp.subtract(MoneyUtils.ONE),MoneyUtils.MATHCONTEXT); } /** *Description:月还款利息。(贷款本金×月利率-月还款额)*(1+月利率)^(当前期数-1)+月还款额
*@paramprincipal贷款本金 *@parammonthlyInterestRate月利率 *@parammonthlyRepayment月还款额 *@paramnumber当前期数 *@return */ publicstaticBigDecimalmonthlyInterest(BigDecimalprincipal,BigDecimalmonthlyInterestRate,BigDecimalmonthlyRepayment,intnumber){ //(1+月利率)^(当前期数-1) BigDecimaltemp=monthlyInterestRate.add(MoneyUtils.ONE).pow(number-1); returnprincipal.multiply(monthlyInterestRate) .subtract(monthlyRepayment) .multiply(temp).add(monthlyRepayment,MoneyUtils.MATHCONTEXT); } /** *Description:还款总利息。期数×贷款本金×月利率×(1+月利率)^期数÷〔(1+月利率)^期数-1〕-贷款本金
*@paramprincipal贷款本金 *@parammonthlyInterestRate月利率 *@paramamount还款期数 *@return */ publicstaticBigDecimalinterest(BigDecimalprincipal,BigDecimalmonthlyInterestRate,intamount){ //(1+月利率)^期数 BigDecimaltemp=monthlyInterestRate.add(MoneyUtils.ONE).pow(amount); returnnewBigDecimal(amount) .multiply(principal) .multiply(monthlyInterestRate) .multiply(temp) .divide(temp.subtract(MoneyUtils.ONE),MoneyUtils.MATHCONTEXT) .subtract(principal,MoneyUtils.MATHCONTEXT); } /** *Description:月还款本金。已经精确到分位,未做单位换算
*@paramprincipal贷款本金 *@parammonthlyInterestRate月利率 *@parammonthlyRepayment月还款额 *@paramnumber当前期数 *@return */ publicstaticBigDecimalmonthlyPrincipal(BigDecimalprincipal,BigDecimalmonthlyInterestRate,BigDecimalmonthlyRepayment,intnumber){ BigDecimalmonthInterest=monthlyInterest(principal,monthlyInterestRate,monthlyRepayment,number); //月还款额-月还款利息 returnmonthlyRepayment.subtract(monthInterest).setScale(MoneyUtils.MONEYSHOWSCALE,MoneyUtils.SAVEROUNDINGMODE); } /** *Description:月还款本金。已经精确到分位,未做单位换算
*@parammonthRepayment月还款总额 *@parammonthInterest月还款利息 *@return */ publicstaticBigDecimalmonthPrincipal(BigDecimalmonthRepayment,BigDecimalmonthInterest){ //月还款总额-月还款利息 returnmonthRepayment.subtract(monthInterest).setScale(MoneyUtils.MONEYSHOWSCALE,MoneyUtils.SAVEROUNDINGMODE); } }
先息后本
importjava.math.BigDecimal; /** *Title:先息后本还款方式工具类型
*/ publicclassBIAPPUtilsextendsRepaymentUtils{ /** *Description:月还款利息贷款本金×月利率
*@paramloan贷款本金 *@parammonthlyInterestRate月利率 *@return */ publicstaticBigDecimalmonthlyInterest(BigDecimalloan,BigDecimalmonthlyInterestRate){ returnloan.multiply(monthlyInterestRate,MoneyUtils.MATHCONTEXT); } /** *Description:还款总利息贷款本金×月利率×期数
*@paramloan贷款本金 *@parammonthlyInterestRate月利率 *@paramnumber期数 *@return */ publicstaticBigDecimalinterest(BigDecimalloan,BigDecimalmonthlyInterestRate,intnumber){ returnloan.multiply(monthlyInterestRate).multiply(newBigDecimal(number),MoneyUtils.MATHCONTEXT); } /** *Description:月还款额
*@paramloan贷款本金 *@parammonthlyInterestRate月利率 *@paramamount期数 *@paramcurNumber当前期数 *@return */ publicstaticBigDecimalmonthlyRepayment(BigDecimalloan,BigDecimalmonthlyInterestRate,intamount,intcurNumber){ BigDecimalmonthlyInterest=monthlyInterest(loan,monthlyInterestRate); if(amount==curNumber){ returnmonthlyInterest.add(loan,MoneyUtils.MATHCONTEXT);//最后月还款额 }else{ returnmonthlyInterest; } } }
*金额计算工具类
importjava.math.BigDecimal;
importjava.math.MathContext;
importjava.math.RoundingMode;
importjava.text.NumberFormat;
publicclassMoneyUtils{
/**
*标度(小数位数)
*/
publicstaticfinalintSCALE=10;
/**
*金钱显示标度(小数位数)
*/
publicstaticfinalintMONEYSHOWSCALE=2;
/**
*利率显示标度(小数位数)
*/
publicstaticfinalintINTERESTRATESHOWSCALE=4;
/**
*精度
*/
publicstaticfinalintPRECISION=30;
/**
*保存舍入规则
*/
publicstaticfinalRoundingModeSAVEROUNDINGMODE=RoundingMode.HALF_UP;
/**
*是否舍去小数点最后的零
*/
publicstaticbooleanSTRIPTRAILINGZEROS=true;
/**
*运算上下文(设置精度、舍入规则)
*/
publicstaticfinalMathContextMATHCONTEXT=newMathContext(PRECISION,SAVEROUNDINGMODE);
/**
*每年天数
*/
publicstaticfinalStringYEARDAYS="360";
/**
*每年月数
*/
publicstaticfinalStringYEARMOTHS="12";
/**
*每月天数
*/
publicstaticfinalStringMOTHDAYS="30";
/**
*数字“1”
*/
publicstaticfinalBigDecimalONE=newBigDecimal(1);
/**
*数字“100”
*/
publicstaticfinalBigDecimalHUNDRED=newBigDecimal(100);
/**
*数字“0.01”
*/
publicstaticfinalBigDecimalONEHUNDREDTH=newBigDecimal(0.01);
publicstaticBigDecimalnewBigDecimal(Stringstr){
return(str==null||str.trim().isEmpty())?BigDecimal.ZERO:newBigDecimal(str);
}
/**
*Description:加法返回格式化结果数字
*@paramaddend
*@paramaugend
*@return
*/
publicstaticBigDecimaladd(BigDecimaladdend,BigDecimalaugend){
returnformatMoney(addend.add(augend,MATHCONTEXT));
}
/**
*Description:加法返回格式化结果数字
*@paramaddend
*@paramaugend
*@return
*/
publicstaticBigDecimaladd(Stringaddend,Stringaugend){
BigDecimaldecimalAddend=newBigDecimal(addend);
BigDecimaldecimalAugend=newBigDecimal(augend);
returnformatMoney(decimalAddend.add(decimalAugend,MATHCONTEXT));
}
/**
*Description:加法返回格式化结果字符串
*@paramaddend
*@paramaugend
*@return
*/
publicstaticStringaddToString(BigDecimaladdend,BigDecimalaugend){
returnformatToString(addend.add(augend,MATHCONTEXT));
}
/**
*Description:加法返回格式化结果字符串
*@paramaddend
*@paramaugend
*@return
*/
publicstaticStringaddToString(Stringaddend,Stringaugend){
BigDecimaldecimalAddend=newBigDecimal(addend);
BigDecimaldecimalAugend=newBigDecimal(augend);
returnformatToString(decimalAddend.add(decimalAugend,MATHCONTEXT));
}
/**
*Description:减法返回格式化结果数字
*@paramminuend
*@paramsubtrahend
*@return
*/
publicstaticBigDecimalsubtract(BigDecimalminuend,BigDecimalsubtrahend){
returnformatMoney(minuend.subtract(subtrahend,MATHCONTEXT));
}
/**
*Description:减法返回格式化结果数字
*@paramminuend
*@paramsubtrahend
*@return
*/
publicstaticBigDecimalsubtract(Stringminuend,Stringsubtrahend){
BigDecimaldecimalMinuend=newBigDecimal(minuend);
BigDecimaldecimalSubtrahend=newBigDecimal(subtrahend);
returnformatMoney(decimalMinuend.subtract(decimalSubtrahend,MATHCONTEXT));
}
/**
*Description:减法返回格式化结果字符串
*@paramminuend
*@paramsubtrahend
*@return
*/
publicstaticStringsubtractToString(BigDecimalminuend,BigDecimalsubtrahend){
returnformatToString(minuend.subtract(subtrahend,MATHCONTEXT));
}
/**
*Description:减法返回格式化结果字符串
*@paramminuend
*@paramsubtrahend
*@return
*/
publicstaticStringsubtractToString(Stringminuend,Stringsubtrahend){
BigDecimaldecimalMinuend=newBigDecimal(minuend);
BigDecimaldecimalSubtrahend=newBigDecimal(subtrahend);
returnformatToString(decimalMinuend.subtract(decimalSubtrahend,MATHCONTEXT));
}
/**
*Description:乘法返回格式化结果数字
*@parammultiplier
*@parammultiplicand
*@return
*/
publicstaticBigDecimalmultiply(BigDecimalmultiplier,BigDecimalmultiplicand){
returnformatMoney(multiplier.multiply(multiplicand,MATHCONTEXT));
}
/**
*Description:乘法返回格式化结果数字
*@parammultiplier
*@parammultiplicand
*@return
*/
publicstaticBigDecimalmultiply(Stringmultiplier,Stringmultiplicand){
BigDecimaldecimalMultiplier=newBigDecimal(multiplier);
BigDecimaldecimalMultiplicand=newBigDecimal(multiplicand);
returnformatMoney(decimalMultiplier.multiply(decimalMultiplicand,MATHCONTEXT));
}
/**
*Description:乘法返回格式化结果字符串
*@parammultiplier
*@parammultiplicand
*@return
*/
publicstaticStringmultiplyToString(BigDecimalmultiplier,BigDecimalmultiplicand){
returnformatToString(multiplier.multiply(multiplicand,MATHCONTEXT));
}
/**
*Description:乘法返回格式化结果字符串
*@parammultiplier
*@parammultiplicand
*@return
*/
publicstaticStringmultiplyToString(Stringmultiplier,Stringmultiplicand){
BigDecimaldecimalMultiplier=newBigDecimal(multiplier);
BigDecimaldecimalMultiplicand=newBigDecimal(multiplicand);
returnformatToString(decimalMultiplier.multiply(decimalMultiplicand,MATHCONTEXT));
}
/**
*Description:除法返回格式化结果数字
*@paramdividend
*@paramdivisor
*@return
*/
publicstaticBigDecimaldivide(BigDecimaldividend,BigDecimaldivisor){
returnformatMoney(dividend.divide(divisor,MATHCONTEXT));
}
/**
*Description:除法返回格式化结果数字
*@paramdividend
*@paramdivisor
*@return
*/
publicstaticBigDecimaldivide(Stringdividend,Stringdivisor){
BigDecimaldecimalDividend=newBigDecimal(dividend);
BigDecimaldecimalDivisor=newBigDecimal(divisor);
returnformatMoney(decimalDividend.divide(decimalDivisor,MATHCONTEXT));
}
/**
*Description:除法返回格式化结果字符串
*@paramdividend
*@paramdivisor
*@return
*/
publicstaticStringdivideToString(BigDecimaldividend,BigDecimaldivisor){
returnformatToString(dividend.divide(divisor,MATHCONTEXT));
}
/**
*Description:除法返回格式化结果字符串
*@paramdividend
*@paramdivisor
*@return
*/
publicstaticStringdivideToString(Stringdividend,Stringdivisor){
BigDecimaldecimalDividend=newBigDecimal(dividend);
BigDecimaldecimalDivisor=newBigDecimal(divisor);
returnformatToString(decimalDividend.divide(decimalDivisor,MATHCONTEXT));
}
/**
*Description:月利率计算
*@paramyearInterestRate
*@return
*/
publicstaticBigDecimalmonthInterestRate(BigDecimalyearInterestRate){
BigDecimaldayInterestRate=MoneyUtils.divide(yearInterestRate,YEARDAYS).setScale(5,RoundingMode.CEILING);
System.err.println(dayInterestRate);
BigDecimalmonthInterestRate=dayInterestRate.multiply(newBigDecimal(MOTHDAYS));
System.err.println(monthInterestRate);
returnmonthInterestRate;
}
/**
*Description:按既定小数位数格式化金额保存
*@paramresult
*@return
*/
publicstaticBigDecimalformatMoney(BigDecimalresult){
returnresult.setScale(SCALE,SAVEROUNDINGMODE);
}
/**
*Description:按既定小数位数格式化金额显示
*@paramresultStr要格式化的数
*@parammultiple乘以的倍数
*@return
*/
publicstaticStringformatMoneyToShow(StringresultStr,BigDecimalmultiple){
BigDecimalresult=newBigDecimal(resultStr);
returnMoneyUtils.formatToString(MoneyUtils.formatMoneyToShow(result,multiple));
}
/**
*Description:按既定小数位数格式化金额显示
*@paramresult要格式化的数
*@parammultiple乘以的倍数
*@return
*/
publicstaticBigDecimalformatMoneyToShow(BigDecimalresult,BigDecimalmultiple){
returnresult.multiply(multiple).setScale(MONEYSHOWSCALE,SAVEROUNDINGMODE);
}
/**
*Description:按既定小数位数格式化利率显示
*@paramresult要格式化的数
*@parammultiple乘以的倍数
*@return
*/
publicstaticBigDecimalformatInterestRateToShow(BigDecimalresult,BigDecimalmultiple){
returnresult.multiply(multiple).setScale(INTERESTRATESHOWSCALE,SAVEROUNDINGMODE);
}
/**
*Description:按既定小数位数格式化显示
*@paramresult要格式化的数
*@paramscale显示标度(小数位数)
*@return
*/
publicstaticBigDecimalformatToShow(BigDecimalresult,intscale){
returnresult.setScale(scale,SAVEROUNDINGMODE);
}
/**
*Description:格式化为字符串,进行去零不去零操作
*@paramresult
*@return
*/
publicstaticStringformatToString(BigDecimalresult){
if(result==null){
return"";
}else{
returnSTRIPTRAILINGZEROS?result.stripTrailingZeros().toPlainString():result.toPlainString();
}
}
/**
*Description:按既定小数位数格式化为货币格式
*@paramresult
*@return
*/
publicstaticStringformatToCurrency(BigDecimalresult){
BigDecimaltemp=result.divide(HUNDRED,SAVEROUNDINGMODE);
NumberFormatnumberFormat=NumberFormat.getCurrencyInstance();
returnnumberFormat.format(STRIPTRAILINGZEROS?temp.stripTrailingZeros():temp);
}
publicstaticStringformatToPercent(BigDecimalresult){
BigDecimaltemp=result.divide(HUNDRED,SAVEROUNDINGMODE);
NumberFormatnumberFormat=NumberFormat.getPercentInstance();
returnnumberFormat.format(STRIPTRAILINGZEROS?temp.stripTrailingZeros():temp);
}
/**
*Description:格式化数字为千分位显示;
*@paramtext
*@return
*/
publicstaticStringfmtMicrometer(Stringtext){
DecimalFormatdf=null;
if(text.indexOf(".")>0){
if(text.length()-text.indexOf(".")-1==0){
df=newDecimalFormat("###,##0.");
}elseif(text.length()-text.indexOf(".")-1==1){
df=newDecimalFormat("###,##0.0");
}else{
df=newDecimalFormat("###,##0.00");
}
}else{
df=newDecimalFormat("###,##0.00");
}
doublenumber=0.0;
try{
number=Double.parseDouble(text);
}catch(Exceptione){
number=0.0;
}
returndf.format(number);
}
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!