BigDecimal等于()vs compareTo()

时间:2011-07-22 07:56:18

标签: java equals 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

问题:compareTo()equals()BigDecimal之间的区别compareTo可以确定x等于y?< / p>

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

4 个答案:

答案 0 :(得分:192)

答案在the JavaDoc of the equals() method

  

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

换句话说:equals()检查每个方面的BigDecimal个对象是否完全相同。 compareTo()“仅”比较其数值。

答案 1 :(得分:1)

  

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

基本上,如果需要,inflate()会调用BigInteger.valueOf(intCompact),即它会创建从BigInteger存储为long intCompact的未缩放值。如果您不需要BigInteger且未缩放的值适合long BigDecimal,则可能会尝试尽可能长时间地节省空间。

答案 2 :(得分:0)

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

1.00001 and 1.00002

嗯,这取决于规模。在小数位数5(小数点后5位)上,否,它们不相同。但是在较小的十进制精度(小于等于4的小数位)上,它们被视为相等。 因此,我建议使两个数字的比例相等,然后进行比较。

答案 3 :(得分:-7)

您还可以与双倍值

进行比较
BigDecimal a= new BigDecimal("1.1"); BigDecimal b =new BigDecimal("1.1");
System.out.println(a.doubleValue()==b.doubleValue());