首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么BigDecimal.ZERO是不缩放的?

问为什么BigDecimal.ZERO是不缩放的?
EN

Stack Overflow用户
提问于 2015-09-24 11:54:54
回答 1查看 4.9K关注 0票数 2

BigDecimal.ZERO的Javadoc表示The value 0, with a scale of 0.,顾名思义,人们可能认为BigDecimal.ZERO应该返回值0.0。

我还知道BigDecimal.ZERO的编码方式是这样的:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-24 12:01:49

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

使用scale 0定义BigDecimal.ZERO的优点是,应该由开发人员来设置所需的规模。例如,您可以使用不同的标度构造值为0的BigDecimal:

代码语言:javascript
复制
BigDecimal zero = BigDecimal.ZERO.setScale(2);

Scale 0提供了一个很好的默认值,并与principle of least astonishment保持一致。

让我们先承认,BigDecimal.ZERO被定义为0.0。考虑以下代码:

代码语言:javascript
复制
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,b2的标度为1(因为add返回的BigDecimal是两个BigDecimal标度的最大值)。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32760661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档