请看图:
//double 转 BigDecimal 精度测试
@Test
public void a (){
Double Dou = 5.56;
BigDecimal bigDou1 = new BigDecimal(Dou);
BigDecimal bigDou2 = BigDecimal.valueOf(Dou);
log.info("Double转BigDecimal,使用构造方法转化="+bigDou1);//5.55999999999999960920149533194489777088165283203125
log.info("Double转BigDecimal,使用字符串形式转化="+bigDou2);//5.56
}
很明显,经过 double 转 BigDecimal 后,我们最初的值已经发生变化,所以通常我们在做类型转换的时候推荐使用 BigDecimal.valueOf(...);
分析:JDK1.8 源码
BigDecimal bigDou1 = new BigDecimal(Dou);
这个转换结果是double的二进制浮点值的精确十进制表示,其值得结果不是我们可以预测的,如上测试类,经过类型转换:5.56变成了5.55999999999999960920149533194489777088165283203125。是因为转化过程默认使用了精度和舍入模式:
public BigDecimal(double val, MathContext