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);
}