BigDecimal.valueOf(double val)与new BigDecimal(double val)的区别是什么呢?
查看java源码,可以发现BigDecimal.valueOf(double val)方法还是调用了new BigDecimal() 构造方法,不过它是将val参数转成String类型后才传递过去的:
public static BigDecimal valueOf(double val) {
return new BigDecimal(Double.toString(val));
}
如果使用 new BigDecimal(d),那么 BigDecimal 会尝试尽可能准确地表示双精度值,这通常会使存储的数字比正常多很多。
例如:
double val= 0.989999999999999111D; System.out.println(BigDecimal.valueOf(val)); //0.9899999999999991 System.out.println(new BigDecimal(val)); //0.9899999999999991029397961028735153377056121826171875
而BigDecimal.valueOf(double val)已经提前将double值转成了String类型,所以存储的数字位数不会增加。
总结 // 不好的做法
double val = 0.989999999999999111D;
System.out.println(BigDecimal.valueOf(val));
System.out.println(new BigDecimal(val));
// 直接传递String参数才是正确做法
System.out.println(new BigDecimal("0.989999999999999111"));
输出结果:
0.9899999999999991 0.9899999999999991029397961028735153377056121826171875 0.989999999999999111
如果参数时int、long、字符串,这两种方式没区别。
如果是float或double,这两种方法都不精确,正确做法是自己构造BigDecimal对象时传递String字符串进去,而不要出现float或double。



