比较BigDecimal是否大于零

San*_*osh 227 java compare bigdecimal

如果BigDecimal值大于零,我该如何比较?

Jon*_*eet 374

它很简单:

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

对文件compareTo实际上规定,它将返回-1,0或1,但更普遍Comparable<T>.compareTo的适当3箱子方法只能保证小于零,零,或大于零-所以我通常只是坚持这种比较.

  • 需要额外的警告.假设`value`的值为零但是非零刻度(例如,它的计算结果为'0.00`而不是'0`).你可能想要认为它等于零.`compareTo()`方法确实会这样做.**但是`equals()`方法不会.**(另一个证明,如果需要的话,Loki或他的一个化身活着并且已经进入软件开发.) (50认同)
  • 虽然我同意这是Java中惯用的解决方案,但我认为它实际上并不可读.每当我遇到这样的表情时,我发现自己正在编写一个测试来向我保证我已经得到了正确的解决方法.也许最近添加的类,如`LocalDate`包括[`isBefore`](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#isAfter-java.time .chrono.ChronoLocalDate-)表明Oracle有同样的感觉.这并不理想,但我认为在这些情况下编写实用程序`isGreaterThan`方法稍微有点可读性. (8认同)
  • @Angelina:我当然希望它 - 这些值 *不* 大于 0,所以我希望 `compareTo` 返回 0。但如果你担心,你应该很容易测试。 (3认同)

Ant*_*nov 157

可能更好的方法:

if (value.signum() > 0)
Run Code Online (Sandbox Code Playgroud)

  • 这是公共API的一部分.所以对我来说,这是一个更好的方式.目的是确定标志是否为正(即>零) (25认同)
  • BigDecimal.compareTo()首先将signums作为优化进行比较.所以最好调用compareTo(),因为它更有意图揭示并且只花费额外方法调用的价格(我怀疑它会被内联). (12认同)
  • @IsmailYavuz 对于不完整的评论,我深表歉意!我至少应该写一个论证的证明,我的错。现在我正在寻找发生了什么,因为我记得我必须将“signum”更改为“compareTo”,但我不知道为什么。这可能是我的错误,因为我现在做了几次测试,我没有发现使用带小数的数字的“符号”有任何问题。 (4认同)
  • 如果你看看反编译的`BigDecimal.compareTo()`方法,你会发现它调用了`signum()`两次.因此,就性能而言,`signum()`更好. (2认同)
  • 小数点的情况有什么问题?@jfajunior (2认同)

yOs*_*shi 16

使用该方法更安全compareTo()

    BigDecimal a = new BigDecimal(10);
    BigDecimal b = BigDecimal.ZERO;

    System.out.println(" result ==> " + a.compareTo(b));
Run Code Online (Sandbox Code Playgroud)

控制台打印

    result ==> 1
Run Code Online (Sandbox Code Playgroud)

compareTo()回报

  • 1 如果 a 大于 b
  • 如果 a 小于 b,则为-1
  • 如果 a 等于 b,则为0

现在对于你的问题你可以使用

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

或者

if (value.compareTo(new BigDecimal(0)) > 0)
Run Code Online (Sandbox Code Playgroud)

我希望它对你有帮助。


duf*_*ymo 11

使用compareTo()内置于类中的函数.