Java中的簡單浮點數類型float和double直接運算,精度不準,推薦使用 BigDecimal 計算。
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 四舍五入
*注意*:除法的時候一定要在divide方法中傳遞第二個參數,定義精确到小數點後幾位,否則在不整除的情況下,結果是無限循環小數時,就會抛出異常:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。
一個簡單的測試類:
@Test
public void redisTestjisuan(){
BigDecimal benjin = new BigDecimal(100000.00);
int qishu = 3;
BigDecimal lilv = new BigDecimal(0.015);
// 每月還款額=[貸款本金×月利率×(1+月利率)^還款月數]÷[(1+月利率)^還款月數-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);
}