为什么 BigDecimal.ZERO 未缩放?

Why BigDecimal.ZERO is unscaled?

BigDecimal.ZERO 的 Java 文档说 The value 0, with a scale of 0. 顾名思义,人们可能认为 BigDecimal.ZERO 应该 return 值 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 return 是未缩放的零而不是 return 十进制零(至少在缩放 1 时默认值,即 0.0).

BigDecimal.ZEROBigInteger.ZERO 都 return 的值 0 与规模 0 有什么关系?

我不知道为什么你认为 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) because they would have different scale: b would have a scale of 0 and b2 would have a scale of 1 (because add returns 一个 BigDecimal 其规模是两个 BigDecimal小号)。