如何正确比较BigDecimal?

9

最近,Android Studio在我写下以下代码时显示了一个警告(我认为是因为我将代码转换为Kotlin才出现的,但不确定):

if (myValue.compareTo(BigDecimal.ZERO) > 0)

这条信息意思是“该用二进制运算符替换可替代的调用”,然后将我的代码替换为:
if (myValue > BigDecimal.ZERO)

我注意到我也使用了。
if (myValue.compareTo(BigDecimal.ZERO) == 0

但这一次我没有收到警告,如果我尝试替换它,它就无法工作。
if (myValue == BigDecimal.ZERO) // DOES NOT WORK

为什么使用 > ZERO 可行而不是 == ZERO?为什么 stackoverflow 上的每个线程(例如此处)都建议使用 compareTo,但 > ZERO 可以工作并被 Android Studio 推荐?

如果你执行 myValue == 0 会发生什么? - President James K. Polk
BigDecimal("0.00") == BigDecimal.ZERO 会返回 false。 - Bencri
我有同样的问题,你找到了好答案吗? - dicarlomagnus
自从那时,我已经转换到了 Kotlin,并使用 Kotlin 扩展函数来提高可读性并隐藏混乱的部分。 - Bencri
1个回答

9

tl;dr:

  • val1 > val2 -> val1.compareTo(val2) > 0
  • val1 == val2 -> val1.equals(val2)
  • BigDecimal.equals(...) 的行为与你期望的不同。

这是因为 Kotlin 将二元运算符 >, >=, <, 和 <= 替换为一个调用 .compareTo,所以 val1 > val2val1.compareTo(val2) > 0 是完全相同的。

然而,问题在于 val1 == val2 被替换为一个调用 .equals,而 BigDecimal.equals 的行为与你想象的不同。检查是否相等的“正确”方法是你已经有的,即 val1.compareTo(val2) == 0

你可以在这里阅读 Kotlin 贡献者在 2016 年开始讨论此问题的相关讨论.


我想简化它,尽管BigDecimal.compareTo的代码文档说:“提供此方法是为了优先使用每个六个布尔比较运算符的单独方法”。 - Rick Tilley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接