我是靠谱客的博主 明理犀牛,最近开发中收集的这篇文章主要介绍了解 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) 的区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部