为什么 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.ZERO
和 BigInteger.ZERO
都 return 的值 0
与规模 0
有什么关系?
我不知道为什么你认为 BigDecimal.ZERO
应该是 0.0
。为什么不是 0.00
或 0.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 ??
b
和 b2
将不相等(根据 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
小号)。
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.ZERO
和 BigInteger.ZERO
都 return 的值 0
与规模 0
有什么关系?
我不知道为什么你认为 BigDecimal.ZERO
应该是 0.0
。为什么不是 0.00
或 0.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 ??
b
和 b2
将不相等(根据 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
小号)。