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.ZERO
和BigInteger.ZERO
两者都需要返回值为0
的值0
?
答案 0 :(得分:10)
我不知道您认为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
),因为它们会有不同的比例:b
的比例为0,{{1} }的比例为1(因为add
会返回b2
,其比例是两个BigDecimal
比例的最大值。