java BigDecimal 遇到的坑 BigDecimal 注意点事项 BigDecimal 比较大小

  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、.........更多的,自己去看看呗。

发布了156 篇原创文章 · 获赞 159 · 访问量 49万+

猜你喜欢

转载自blog.csdn.net/HaHa_Sir/article/details/102868793
今日推荐