最近发现工程里出现金额精度问题,记录下使用区别:
public static void main(String[] args) {
Double a = 0.1;
BigDecimal b = new BigDecimal(a);
BigDecimal c = BigDecimal.valueOf(a);
System.out.println("b is :"+b);
System.out.println("c is :"+c);
}
b is :0.1000000000000000055511151231257827021181583404541015625
c is :0.1
问题点:new BigDecimal(double val)
这个方法是不可预测的,以 0.1 为例,如 double 类型的值为 0.1,最后不会返回一个值为 0.1 的 BigDecimal,为什么?原因在于 0.1 无法用有限长度的二进制数表示,无法精确地表示为双精度数,最后的结果会是 0.000110011001…。
解决方案:
1、推荐使用 new BigDecimal(String val)
2、直接使用静态方法 BigDecimal.valueOf(double val)
note
可以直接点构造参数进去查看原有的源码注释,这些问题其实之前是已经注释过的
标签:BigDecimal,val,0.1,Double,valueOf,double,new,精度 From: https://blog.51cto.com/u_12929241/8694724