178

考虑简单的测试类:

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

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

4

4 回答 4

259

答案在方法的 JavaDoc 中equals()

与 不同compareTo的是,此方法仅当两个BigDecimal对象的值和比例相等时才认为它们相等(因此,通过此方法进行比较时,2.0 不等于 2.00)。

换句话说:equals()检查BigDecimal对象在各个方面是否完全相同。"only" 比较它们的数值。compareTo()

至于为什么会这样, 这个 SO questionequals()已经回答了。

于 2011-07-22T07:59:04.443 回答
1

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

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

于 2011-07-22T08:18:51.727 回答
1

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

1.00001 and 1.00002

嗯,这取决于规模。在 5 级(小数点后 5 个)上,不,它们不一样。但在较小的十进制精度(4 级或更低)上,它们被认为是相等的。所以我建议让两个数字的比例相等,然后比较它们。

于 2019-12-11T06:32:19.060 回答
-12

您还可以与双值进行比较

BigDecimal a= new BigDecimal("1.1"); BigDecimal b =new BigDecimal("1.1");
System.out.println(a.doubleValue()==b.doubleValue());
于 2017-09-15T11:39:14.713 回答