我是靠谱客的博主 明理犀牛,最近开发中收集的这篇文章主要介绍了解 BigDecimal.valueOf(double val)与new BigDecimal(double val) 的区别,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
区别
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。
最后
以上就是明理犀牛为你收集整理的了解 BigDecimal.valueOf(double val)与new BigDecimal(double val) 的区别的全部内容,希望文章能够帮你解决了解 BigDecimal.valueOf(double val)与new BigDecimal(double val) 的区别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复