BigDecimal 等于()与 compareTo ()

考虑一下这个简单的测试类:

import java.math.BigDecimal;


/**
* @author The Elite Gentleman
*
*/
public class Main {


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BigDecimal x = new BigDecimal("1");
BigDecimal y = new BigDecimal("1.00");
System.out.println(x.equals(y));
System.out.println(x.compareTo(y) == 0 ? "true": "false");
}


}

你可以(有意识地)说 x等于 y(不是对象引用) ,但是当你运行程序时,下面的结果显示:

false
true

问: BigDecimalcompareTo()equals()的区别是什么,compareTo可以确定 x等于 y

PS: 我看到 BigDecimal 在 equals()方法上有一个 inflate()方法。 inflate()实际上是做什么的?

150130 次浏览

答案就在 equals()方法的 JavaDoc:

compareTo不同,该方法只考虑值和比例相等的两个 BigDecimal对象相等(因此,用该方法比较时,2.0不等于2.00)。

换句话说: equals()检查 BigDecimal对象在 每个方面是否与 没错相同。compareTo()“只”比较它们的数值。

至于 为什么 equals()的这种行为,这已经得到了回答 在这个 SO 问题中

我看到 BigDecimal 在 equals ()方法上有一个充气()方法。充气()实际上是做什么的?

基本上,如果需要,inflate()调用 BigInteger.valueOf(intCompact),也就是说,它创建未缩放的值,该值从 long intCompact存储为 BigInteger。如果你不需要的 BigInteger和未缩放的值适合一个 long BigDecimal似乎试图尽可能长的节省空间。

您也可以比较双值

BigDecimal a= new BigDecimal("1.1"); BigDecimal b =new BigDecimal("1.1");
System.out.println(a.doubleValue()==b.doubleValue());

我相信正确的答案是让这两个数(BigDecimals)具有相同的比例,然后我们就可以决定它们是否相等。例如,这两个数字是相等的吗?

1.00001 and 1.00002

那要看规模大小了。在尺度5(5小数点) ,没有他们是不一样的。但在较小的十进制精度(尺度4和更低) ,它们被认为是相等的。 所以我建议让这两个数字的比例相等,然后比较它们。