栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

了解 BigDecimal.valueOf(double val)与new BigDecimal(double val) 的区别

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

了解 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。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/439653.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号