【问题标题】:Why is BigDecimal("20") not equal to BigDecimal("2E+1") [duplicate]为什么 BigDecimal("20") 不等于 BigDecimal("2E+1") [重复]
【发布时间】:2021-07-19 15:01:24
【问题描述】:

我可以理解,在 BigDecimals 中,2.0 不等于 2.00,因为 2.00 实际上使用了更精确的数字。我难以理解的是为什么2E+1 不被认为等于20,因为这两个数字实际上使用相同数量的精度数字。恕我直言,它们只是完全相同数字的不同表示。

我知道,我可以使用stripTrailingZeroscompareTo 而不是equals,我只是对这背后的原因感兴趣。有人可以帮助我理解这一点吗?

【问题讨论】:

  • 您认为2E+120 具有相同精度的假设是错误的。 2E+1 具有一位精度,而 20 具有两位精度。
  • compareTo alone 按数值比较 BigDecimals,而不是 equals
  • @Pieter12345 20号有0位,2E+1有-1位。
  • @Michael 正确。但这是纯粹的技术点还是这些数字实际上有任何区别?
  • new BigDecimal("2E+1") 的精度为 1,这意味着它可以代表任何数字 n,其中 20 new BigDecimal("20") 的精度为 2 和因此只能代表一个数字 x 其中 20

标签: java bigdecimal


【解决方案1】:

这是一个规模问题。

System.out.println(new BigDecimal("20").scale()); // 0
System.out.println(new BigDecimal("2E+1").scale()); // -1

BigDecimal 将数值相等但比例不同的数字视为不相等。

【讨论】:

  • 来自文档“例如,-3 的比例表示未缩放的值乘以 1000。”
  • 是的,我在 BigDecimal if (scale != xDec.scale) 的 equals 方法中看到了这一点,但这仍然给我留下了为什么的问题。
  • @JanGassen "我可以理解 BigDecimals 中 2.0 不等于 2.00,因为 2.00 实际上使用了更精确的数字" 原因与您在问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多