java double转decimal_Java中Double与BigDecimal的相互转换
大家好,又见面了,我是你们的朋友全栈君。
今天写代码过程中,发现一个Double的变量通过new BigDecimal(Double d)转换为BigDecimal时,有效数字改变了,如下:
public class BigDecimalTest {
public static void main(String[] arg) {
String s1 = “123.45”;
Double d1 = new Double(s1); //使用String类型的形参构造BigDecimal
BigDecimal bg1 = new BigDecimal(d1); //使用Double类型的形参构造BigDecimal
BigDecimal bg2 = new BigDecimal(s1);
System.out.println(“bg1 = “+bg1);
System.out.println(“bg2 = “+bg2);
}
}输出:
bg1 = 123.4500000000000028421709430404007434844970703125
bg2 = 123.45
同样大小的Double数,以字符串形参的方式构造BigDecimal就能得到同样精度。而使用Double构造就会导致精度改变。事实上,按照官方API文档,推荐使用String形参的方式将float、double转换为BidDecimal,文档原文:For values other than float and double NaN and ±Infinity, this constructor is compatible with the values returned by Float.toString(float) and Double.toString(double). This is generally the preferred way to convert a float or double into a BigDecimal, as it doesn‘t suffer from the unpredictability of the BigDecimal(double) constructor。不止如此,还有以下情况:
public class BigDecimalTest {
public static void main(String[] arg) {
String s1 = “123.45”;
String s2 = “123.450”;
Double d1 = new Double(s1);
Double d2 = new Double(s2);
BigDecimal bg1 = new BigDecimal(s1);
BigDecimal bg2 = new BigDecimal(s2);
System.out.println(“d1.equals(d2): “+d1.equals(d2));
System.out.println(“bg1.equals(bg2): “+bg1.equals(bg2));
}
}Output:
d1.equals(d2): true
bg1.equals(bg2): false
同样大小的小数,有效数字不同情况下,Double类型的大小比较结果是相等的,符合我们的实际计算。但是分别转换成BigDecimal后再比较大小,得到不相等的结果。
时间: 12-15
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144143.html原文链接:https://javaforall.cn
相关文章
- java calendar获取年_Java Calendar获取年、月、日、时间,设置年、月、日
- Java中用fastjson对String、JSONObject、JSONArray相互转换
- CAS算法在Java中的应用
- java图书馆新地址_最受Java开发者喜爱的5款开源IDE盘点
- java中文乱码_Java中文乱码问题的解决方案[通俗易懂]
- java实现ajax_Ajax&Java
- java与python-如何对比Python和Java,只需三分钟告诉你!
- java 字符串和整型的相互转换_整型数组转换成字符串
- java arraydeque poll,Java ArrayDeque「建议收藏」
- java中数字与ASCII码的相互转换的代码详解编程语言
- Java实现的utf8,gbk,unicode编码相互转换的代码详解编程语言
- Java将图片与base64编码相互转换详解编程语言
- Java中Date与String的相互转换详解编程语言
- Java–Json解析详解编程语言
- JAVA 中文 unicode 相互转换 文件读取详解编程语言
- Java数组和字符串的相互转换
- Linux重装Java:给你的操作系统新的灵魂(linux重装java)
- Java程序员如何优雅操作Redis(java操作redis)
- 处理解决Redis与Java结合环境中过期数据处理问题(redisjava过期)
- 缓存基于Redis与Java实现有效的过期缓存(redisjava过期)
- 基于Linux操作系统上实现 Java 编程(linux r java)
- Java轻松连接并执行MySQL数据库操作(java执行mysql)
- 实现基于Redis的分布式锁Java实现(redis锁java代码)
- Java程序中使用Redis链接提升效率(redis 链接java)