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

时间:2018-04-11 11:58:46

标签: java

是否可以区分new BigDecimal(0D)install

2 个答案:

答案 0 :(得分:8)

无法区分这一点,因为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

*:不完全准确,你可以有多个不同规模的零,只是没有不同的符号

答案 1 :(得分:1)

javadoc州:

  

BigDecimal由任意精度整数非标定值和32位整数标度组成。

     

因此BigDecimal所代表的数字的值是(unscaledValue×10 scale )。

由于零只有一个整数值,因此无法将“减零”表示为BigDecimal

在内部,BigDecimal的标准实施使用BigInteger来表示“未缩放的值”。虽然javadocs不将此实现细节作为规范的一部分,但上面引用的定义足以排除任何实现,其中有两个不同的正负零值。

当然可以有多个零值;例如00.00不相等。这来自BigDecimal::equals(Object)的定义。