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); } }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!