是否可以区分new BigDecimal(-0D)
和new BigDecimal(0D)
?
没有办法区分这一点,因为java.math.BigDecimal
只知道一个零(*(。它没有正零或负零的概念。
这是因为在内部,BigDecimal
使用BigInteger
,而BigInteger
也只有一个零的概念。BigInteger
表现为二进制补码整数,而二进制补码只有一个零。
另请参阅BigInteger
来源中的此评论:
public class BigInteger extends Number implements Comparable<BigInteger> { /** * The signum of this BigInteger: -1 for negative, 0 for zero, or * 1 for positive. Note that the BigInteger zero <em>must</em> have * a signum of 0. This is necessary to ensures that there is exactly one * representation for each BigInteger value. */ final int signum
*:不完全准确,你可以有多个不同刻度的零,只是不能有不同的符号
javadoc 声明:
BigDecimal
由任意精度的整数未缩放值和 32 位整数小数位数组成。因此,
BigDecimal
表示的数字的值为 (未缩放值× 10刻度(。
由于零只有一个整数值,因此不可能将"负零"表示为BigDecimal
。
在内部,BigDecimal
的标准实现使用BigInteger
来表示"未缩放的值"。 虽然javadocs没有将此实现细节作为规范的一部分,但上面引用的定义足以排除任何正零和负零有两个不同值的实现。
当然,零可以有多个值;例如 0
和0.00
是不平等的。 这源于BigDecimal::equals(Object)
的定义。