Java 为什么BigDecimal.ZERO没有标度?

Java 为什么BigDecimal.ZERO没有标度?,java,biginteger,bigdecimal,zero,Java,Biginteger,Bigdecimal,Zero,BigDecimal.ZERO的Javadoc表示值0,刻度为0。顾名思义,BigDecimal.ZERO应该返回值0.0 我还知道这是BigDecimal.ZERO的编码方式: private static final BigDecimal zeroThroughTen[] = { new BigDecimal(BigInteger.ZERO, 0, 0, 1), new BigDecimal(BigInteger.ONE,

BigDecimal.ZERO
的Javadoc表示值0,刻度为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

我不知道你为什么认为
BigDecimal.ZERO
应该是
0.0
。为什么不
0.00
0.000

使用scale 0定义
BigDecimal.ZERO
的优点是,由开发人员设置所需的比例。例如,始终可以使用不同的比例构造值为0的BigDecimal:

BigDecimal zero = BigDecimal.ZERO.setScale(2);
比例0提供了一个良好的默认值,并符合

让我们先承认
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
将不相等(根据),因为它们的刻度不同:
b
的刻度为0,
b2
的刻度为1(因为返回一个
BigDecimal
,其刻度为两个
BigDecimal
s刻度中的最大值).

我不知道你为什么认为
BigDecimal.ZERO
应该是
0.0
。为什么不
0.00
0.000

使用scale 0定义
BigDecimal.ZERO
的优点是,由开发人员设置所需的比例。例如,始终可以使用不同的比例构造值为0的BigDecimal:

BigDecimal zero = BigDecimal.ZERO.setScale(2);
比例0提供了一个良好的默认值,并符合

让我们先承认
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
将不相等(根据),因为它们的刻度不同:
b
的刻度为0,
b2
的刻度为1(因为返回一个
BigDecimal
,其刻度为两个
BigDecimal
s刻度中的最大值).

为什么它应该是
0.0
而不是
0
0.00
0.0
听起来像是一个相当随意的选择。零是零,所以只要
0
(刻度为0)听起来是一个合理的默认值。你是正确的,那么为什么2个常量定义0呢?因为
BigDecimal
biginger
不仅仅是数字,它们是可以用来存储数字的特殊类,这些常量定义了一个值为零的
BigDecimal
,以及一个值为零的
biginger
。你为什么要问这个问题?坦率地说,无论你还是任何人认为当前的定义是错误的,这都没有区别。定义就是它是什么。向后兼容命令意味着它不会被更改。为了澄清这一点,我很好奇。为什么它应该是
0.0
,而不是
0
0.00
0.0
听起来像是一个相当随意的选择。零是零,所以只要
0
(刻度为0)听起来是一个合理的默认值。你是正确的,那么为什么2个常量定义0呢?因为
BigDecimal
biginger
不仅仅是数字,它们是可以用来存储数字的特殊类,这些常量定义了一个值为零的
BigDecimal
,以及一个值为零的
biginger
。你为什么要问这个问题?坦率地说,无论你还是任何人认为当前的定义是错误的,这都没有区别。定义就是它是什么。向后兼容性命令意味着它不会被更改。我只是想澄清一下,对此很好奇。我同意我认为它应该是0.0我同意我认为它应该是0.0