java BigDecimal 遇到的坑 BigDecimal 注意点事项 BigDecimal 比较大小
一、遇到问题
在使用 java.math包的 BigDecimal类进行高精确度运算时,发现在使用构造方法 new BigDecimal 和 BigDecimal.valueOf 方法创建的 BigDecimal对象,居然不相等的情况,此处容易暗生bug,且难以发现,故记录一下。
二、代码重现
1、new BigDecimal 和 BigDecimal.valueOf 方法创建的 BigDecimal对象
2、输出 BigDecimal 对象
3、比较地址值
4、代码如下:
@Test
public void test() {
double d1 = 0.1D ;
double d2 = 0.1D ;
BigDecimal b1 = new BigDecimal(d1);
BigDecimal b2 = BigDecimal.valueOf(d2);
System.out.println(b1);
System.out.println(b2);
System.out.println(b1 == b2);
}
5、输出结果如下:
0.1000000000000000055511151231257827021181583404541015625
0.1
false
6、问题: b1 比 b2 多了一串浮点数 ,精度异常。
三、BigDecimal 比较大小
1、代码如下:
@Test
public void compare() {
double d1 = 0.1D ;
double d2 = 0.1D ;
BigDecimal b1 = BigDecimal.valueOf(d1);
BigDecimal b2 = BigDecimal.valueOf(d2);
System.out.println(b1 == b2);
System.out.println(b1.equals(b2));
System.out.println(b1.compareTo(b2)); // 返回 int
}
2、输出结果如下:
false
true
0
3、说明: b1.compareTo(b2):返回 int,
等于0,则b1=b2;
等于 1 ,则b1>b2 ;
等于-1,则b1<b2。
四、总结
1、new BigDecimal()精度异常问题,请自行查阅资料,或者看JDK源码了解。
2、对于创建BigDecimal对象,请使用 BigDecimal.valueOf(xx)方法,或者 new BigDecimal(String.valueOf(xx))方法。 ---- 原因可查看源码了解。
3、BigDecimal 比较可以用 compareTo 方法,或者 equals 方法都可以。 --- BigDecimal方法重写了 equals 方法 同时也 实现了 java.lang.Comparable<BigDecimal> 接口。
4、BigDecimal 实现常见运算(加、减、乘、除)需要使用对应的方法,不能直接对象相加。 --- 请自行查阅JDK文档。
5、BigDecimal 还可实现保留若干未小数,setScale() 方法 , 请了解一下。
6、.........更多的,自己去看看呗。