进行 BigDecimal 比较的正确方法是什么

Ben*_*cri 9 android bigdecimal kotlin android-lint android-studio

从最近开始,(我认为是因为我将代码转换为 kotlin,但不确定),Android Studio 在我编写时向我显示警告

if (myValue.compareTo(BigDecimal.ZERO) > 0)
Run Code Online (Sandbox Code Playgroud)

该消息显示“调用可替换为二元运算符”并将我的代码替换为

if (myValue > BigDecimal.ZERO)
Run Code Online (Sandbox Code Playgroud)

我注意到我也使用

if (myValue.compareTo(BigDecimal.ZERO) == 0
Run Code Online (Sandbox Code Playgroud)

但这一次我没有收到任何警告,如果我尝试更换它,它不起作用

if (myValue == BigDecimal.ZERO) // DOES NOT WORK
Run Code Online (Sandbox Code Playgroud)

为什么> ZERO有效但无效== ZERO?为什么我在 stackoverflow 上看到的每个线程(例如this)都推荐使用compareTobut > ZEROwork 并且是 Android Studio 推荐的?

Mat*_*ein 10

长话短说:

  • val1 > val2->val1.compareTo(val2) > 0
  • val1 == val2->val1.equals(val2)
  • BigDecimal.equals(...)不按您期望的方式工作。

发生这种情况是因为 Kotlin 将二元运算符>, >=, <, 和<=替换为对 的调用.compareTo,所以val1 > val2与 完全相同val1.compareTo(val2) > 0

但是,问题是 被val1 == val2替换为对 的调用.equals,并且BigDecimal.equals其行为与您认为应该的方式不同。检查是否相等的“正确”方法是您已经拥有的方法,即val1.compareTo(val2) == 0

您可以在此处阅读 Kotlin 贡献者从 2016 年开始就该问题进行的讨论。