【问题标题】:Why BigDecimal.ZERO is unscaled?为什么 BigDecimal.ZERO 未缩放?
【发布时间】:2015-09-24 11:54:54
【问题描述】:

BigDecimal.ZERO 的 Javadoc 是 The value 0, with a scale of 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.ZEROBigInteger.ZERO 都返回值0 和规模0 有什么需要?

【问题讨论】:

  • 为什么应该是0.0 而不是00.000.0 听起来像是一个相当随意的选择。零就是零,所以 0(比例为 0)听起来是一个合理的默认值。
  • 你是正确的零是零,那么为什么2个常量定义0
  • 因为BigDecimalBigInteger不仅仅是数字,它们是可以用来存储数字的特殊类,常量定义了一个BigDecimal,其值为0和一个BigInteger值为零。
  • 你为什么要问?坦率地说,您或任何人是否认为当前的定义不正确都没有区别。定义就是它。向后兼容的必要性意味着它不会被改变
  • 问只是为了澄清,对此很好奇。

标签: java biginteger bigdecimal zero


【解决方案1】:

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

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

BigDecimal zero = BigDecimal.ZERO.setScale(2);

Scale 0 提供了一个很好的默认值,并遵循principle of least astonishment

让我们先承认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 ??

bb2 不相等(根据 BigDecimal.equals),因为它们的比例不同:b 的比例为 0,b2 的比例为 1(因为 @ 987654323@ 返回一个BigDecimal,其规模是两个BigDecimals 规模的最大值。

【讨论】:

  • 我同意我认为它应该是 0.0
猜你喜欢
  • 1970-01-01
  • 2021-09-16
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 2015-05-11
  • 2019-07-17
  • 2014-04-20
  • 2014-05-27
相关资源
最近更新 更多