初學(xué)者在使用BigDecimal類(lèi)型時(shí),非常容易用錯(cuò),Java中的簡(jiǎn)單浮點(diǎn)數(shù)類(lèi)型float和double直接運(yùn)算,精度不準(zhǔn),推薦使用 BigDecimal 計(jì)算。
BigDecimal類(lèi)型的加減乘除
BigDecimal bignum1 = new BigDecimal(10.0);
BigDecimal bignum2 = new BigDecimal(10.0);
加法
add = bignum1.add(bignum2);
減法
subtract = bignum1.subtract(bignum2);
乘法
multiply = bignum1.multiply(bignum2);
除法
divide = bignum1.divide(bignum2);
.divide(new BigDecimal(18),2, BigDecimal.ROUND_HALF_UP) // >=5 四舍五入
注意:除法的時(shí)候一定要在divide方法中傳遞第二個(gè)參數(shù),定義精確到小數(shù)點(diǎn)后幾位,否則在不整除的情況下,結(jié)果是無(wú)限循環(huán)小數(shù)時(shí),就會(huì)拋出異常:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。
一個(gè)簡(jiǎn)單的測(cè)試類(lèi):
@Test
public void redisTestjisuan(){
BigDecimal benjin = new BigDecimal(100000.00);
int qishu = 3;
BigDecimal lilv = new BigDecimal(0.015);
// 每月還款額=[貸款本金×月利率×(1+月利率)^還款月數(shù)]÷[(1+月利率)^還款月數(shù)-1]
BigDecimal big = (lilv.add(new BigDecimal(1.0)).pow(qishu)).subtract(new BigDecimal(1));
BigDecimal divide = (benjin.multiply(lilv).multiply(lilv.add(new BigDecimal(1.0)).pow(qishu))).divide(big,2,RoundingMode.HALF_UP);
logger.info("每月還款額="+divide);
}