我是靠谱客的博主 明理犀牛,这篇文章主要介绍了解 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
4
public static BigDecimal valueOf(double val) { return new BigDecimal(Double.toString(val)); }

如果使用 new BigDecimal(d),那么 BigDecimal 会尝试尽可能准确地表示双精度值,这通常会使存储的数字比正常多很多。

例如:

复制代码
1
2
3
4
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类型,所以存储的数字位数不会增加。

总结

复制代码
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
4
0.9899999999999991 0.9899999999999991029397961028735153377056121826171875 0.989999999999999111

如果参数时int、long、字符串,这两种方式没区别。

如果是float或double,这两种方法都不精确,正确做法是自己构造BigDecimal对象时传递String字符串进去,而不要出现float或double。

最后

以上就是明理犀牛最近收集整理的关于了解 BigDecimal.valueOf(double val)与new BigDecimal(double val) 的区别的全部内容,更多相关了解内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(108)

评论列表共有 0 条评论

立即
投稿
返回
顶部