用java.math.BigDecimal区分零和负零

  • 本文关键字:java math BigDecimal java
  • 更新时间 :
  • 英文 :


是否可以区分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没有将此实现细节作为规范的一部分,但上面引用的定义足以排除任何正零和负零有两个不同值的实现。

当然,零可以有多个值;例如 00.00是不平等的。 这源于BigDecimal::equals(Object)的定义。

最新更新