为什么BigDecimal.ZERO未缩放?

时间:2015-09-24 11:54:54

标签: java biginteger bigdecimal zero

BigDecimal.ZERO的Javadoc说The value 0, with a scale of 0.顾名思义,人们可能会认为BigDecimal.ZERO应该返回值0.0

我也知道这是BigDecimal.ZERO的编码方式:

private static final BigDecimal zeroThroughTen[] = {
        new BigDecimal(BigInteger.ZERO,         0,  0, 1),
        new BigDecimal(BigInteger.ONE,          1,  0, 1),
...
}

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

我不明白为什么在Java中决定BigDecimal.ZERO返回未缩放的零而不是返回十进制零(默认情况下至少使用缩放1,即0.0)。

BigDecimal.ZEROBigInteger.ZERO两者都需要返回值为0的值0

1 个答案:

答案 0 :(得分:10)

我不知道您认为BigDecimal.ZERO应该是0.0的原因。为什么不0.000.000

使用比例0定义BigDecimal.ZERO的优点是,开发人员可以设置所需的比例。例如,您始终可以使用不同的比例构造值为0的BigDecimal:

BigDecimal zero = BigDecimal.ZERO.setScale(2);

比例0提供了一个很好的默认值,并且符合principle of least astonishment

让我们承认BigDecimal.ZERO被定义为0.0一秒钟。请考虑以下代码:

BigDecimal b = new BigDecimal("20");
BigDecimal b2 = new BigDecimal("20").add(BigDecimal.ZERO);
System.out.println(b.equals(b2)); // false ??? since when 20 != 20 + 0 ??

bb2不相等(根据BigDecimal.equals),因为它们会有不同的比例:b的比例为0,{{1} }的比例为1(因为add会返回b2,其比例是两个BigDecimal比例的最大值。