我是靠谱客的博主 明理犀牛,这篇文章主要介绍了解 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类型后才传递过去的:
复制代码
1
2
3
4public static BigDecimal valueOf(double val) { return new BigDecimal(Double.toString(val)); }
如果使用 new BigDecimal(d)
,那么 BigDecimal 会尝试尽可能准确地表示双精度值,这通常会使存储的数字比正常多很多。
例如:
复制代码
1
2
3
4double 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类型,所以存储的数字位数不会增加。
总结
复制代码
1
2
3
4
5
6
7// 不好的做法 double val = 0.989999999999999111D; System.out.println(BigDecimal.valueOf(val)); System.out.println(new BigDecimal(val)); // 直接传递String参数才是正确做法 System.out.println(new BigDecimal("0.989999999999999111"));
输出结果:
复制代码
1
2
3
40.9899999999999991 0.9899999999999991029397961028735153377056121826171875 0.989999999999999111
如果参数时int、long、字符串,这两种方式没区别。
如果是float或double,这两种方法都不精确,正确做法是自己构造BigDecimal对象时传递String字符串进去,而不要出现float或double。
最后
以上就是明理犀牛最近收集整理的关于了解 BigDecimal.valueOf(double val)与new BigDecimal(double val) 的区别的全部内容,更多相关了解内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复