BigDecimal是对象,不是基本数据类型,类似于String。所以没有BigDecimal数据类型比较方法这么一说。
这里总结一下用BigDecimal类型对象比较中踩 的坑。

1.BigDecimal不能直接用"=="作比较,编译都不会通过

在这里插入图片描述

2.BigDecimal的equals()方法比较不一定对.

在这里插入图片描述
这里注意:BigDeciaml的equals()方法,参数Object类型.
可以注意一下,equals()方法的源码:注释是我手写的

 public boolean equals(Object x) {
 		//比较对象是否是BigDecimal的数据类型,如果不是直接返回false
        if (!(x instanceof BigDecimal))
            return false;
        BigDecimal xDec = (BigDecimal) x;
        //比较BigDecimalde scale值是否相等
        /* scale 是BigDecimal 的标度。如果为零或正数,则标度是小数点后的位数。
         如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。例如,-3 标度是指非标度值乘以 1000。*/
		if (scale != xDec.scale)
	    	return false;
		if (this.intCompact != INFLATED && xDec.intCompact != INFLATED)
			// 返回给定的xDec.intVal的compact 值,如果太大,则返回INFLATED。
			// 返回给定的this.intVal的compact 值,如果太大,则返回INFLATED。
		    return this.intCompact == xDec.intCompact;
        	return this.inflate().intVal.equals(xDec.inflate().intVal);
    }

从上面来看,如果直接和0比较,肯定是false,因为0不是BigDecimal类型.

3.compareTo()方法比较靠谱

这个是核心比较代码
bigDecimal.compareTo(BigDecimal.ZERO)==0在这里插入图片描述

 compareTo()方法:
 * 将此 BigDecimal 与指定的 BigDecimal 比较。
 *值相等但具有不同标度的两个 BigDecimal 对象(如,2.0 和 2.00)被认为是相等的。
 * 小于、等于或大于 时,返回 -1、0 或 1

BigDecimal有三个常量:0,1,10 对应是ZERO,ONE,TEN

  // Constants
    /**
     * The value 0, with a scale of 0.
     *
     * @since  1.5
     */
    public static final BigDecimal ZERO =
        zeroThroughTen[0];

    /**
     * The value 1, with a scale of 0.
     *
     * @since  1.5
     */
    public static final BigDecimal ONE =
        zeroThroughTen[1];

    /**
     * The value 10, with a scale of 0.
     *
     * @since  1.5
     */
    public static final BigDecimal TEN =
	zeroThroughTen[10];

里面也用了zeroThroughTen[]数组;
这个数组是这么定义的:

 // Cache of common small BigDecimal values.
    private static final BigDecimal zeroThroughTen[] = {
	new BigDecimal(BigInteger.ZERO,		0,  0),
        new BigDecimal(BigInteger.ONE,		1,  0),
        new BigDecimal(BigInteger.valueOf(2),	2,  0),
        new BigDecimal(BigInteger.valueOf(3),	3,  0),
        new BigDecimal(BigInteger.valueOf(4),	4,  0),
        new BigDecimal(BigInteger.valueOf(5),	5,  0),
        new BigDecimal(BigInteger.valueOf(6),	6,  0),
        new BigDecimal(BigInteger.valueOf(7),	7,  0),
        new BigDecimal(BigInteger.valueOf(8),	8,  0),
        new BigDecimal(BigInteger.valueOf(9),	9,  0),
        new BigDecimal(BigInteger.TEN,		10, 0),
    };
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐