
关于BigDecimal的构建方法及数值比较
5星
- 浏览量: 0
- 大小:None
- 文件类型:None
简介:
本篇文章主要介绍Java中BigDecimal类的常用构造方法及其在数值精确计算和比较中的应用。通过详细解析,帮助开发者避免浮点运算误差问题。
在使用Java代码中的`BigDecimal b1 = new BigDecimal(1.0); BigDecimal b2 = new BigDecimal(1.00); boolean t=b1.equals(b2);`这一段时,你可能会发现`t`的值是false。这是因为尽管数值看起来相同,但它们的小数点后的精度不同。因此,在比较两个BigDecimal对象时应该使用`compareTo()`方法而不是直接用equals()。
在进一步测试中,我发现了一个奇怪的问题:代码如下:
```java
BigDecimal bd=supplierRecentProductDao.findHistoryReturnRate(001, 001);
assertEquals(bd.compareTo(new BigDecimal(0.15)), 0);
```
计算得到的`bd`值是正确的(即为`0.15`),但是测试却失败了。输出结果如下:
```java
System.out.println(HistoryReturnRate: + bd + , + new BigDecimal(0.15));
// 输出: HistoryReturnRate: 0.150000, 0.14999999999999998765432...
```
尽管数值非常接近,`new BigDecimal(0.15)`实际上得到的是一个略微小于的目标值的数。这是由于浮点运算的原因造成的。
为了解决这个问题,应该避免使用第三种构造方式(即通过双精度浮点类型创建BigDecimal对象),因为这会导致上述问题的发生。改为:
```java
assertEquals(bd.compareTo(new BigDecimal(0.15)), 0);
```
这样修改之后,测试顺利通过了。
全部评论 (0)


