比较BigDecimal是否大于零


244

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


1
看看github.com/mortezaadi/bigdecimal-utils有一个方法isPositive()还有一个is(bigdecimal).isZero(); is(bigdecimal).notZero(); is(bigdecimal).isPositive(); //大于零的is(bigdecimal).isNegative(); //小于零的is(bigdecimal).isNonPositive(); //小于或等于零的is(bigdecimal).isNonNegative();
Morteza Adi

@MortezaAdi因为BigDecimal实现Comparable了比较功能,例如lt, le, eq, ne最好移到ComparableUtils。因此,它们可以用于任何其他类,例如Date或自定义类型。
djmj

@djmj需求定义了实现,因此没有必要也无意构建ComparableUtils。除了lt,le,eq等功能之外,它与通用类完全不同。
Morteza Adi

Answers:


400

就像这样简单:

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

文档compareTo实际上指定它将返回-1、0或1,但是更通用的Comparable<T>.compareTo方法仅保证在适当的三种情况下小于零,零或大于零-因此,我通常只坚持这种比较。


50
需要额外的警告。假设其value值为零,但标度为非零(例如,其取值为0.00而不是0)。您可能想考虑它等于零。该compareTo()方法确实可以做到这一点。但是该equals()方法不会。 (如果需要的话,另一个证明是Loki或他的化身还活着并且很好,已经进入了软件开发。)
Andrew Spencer

9
虽然我同意这是Java中的惯用解决方案,但我认为它实际上不是可读的。每次遇到这样的表达式时,我都会发现自己正在编写测试以使自己确信自己已正确找到方法。也许最近添加的类(例如LocalDateinclude isBefore)这一事实表明Oracle的感觉也相同。这并不理想,但是我认为在这种情况下编写实用程序isGreaterThan方法的可读性略高。
Mark Slater

如果值是0.00或0.0,@ Jon Skeet解决方案是否也起作用?
Angelina

1
@Angelina:我希望可以肯定的是-这些值大于0,所以我希望compareTo返回0。但是如果您担心,测试起来应该很容易。
乔恩·斯基特

@MarkSlater我同意,compareTo只是Java应该花更多的时间来提高可读性,如果每个人都必须在每个项目中创建自己的可读方法,这是没有意义的。在C#中,您还可以为现有类创建扩展方法,以便可以直接使用`value.isGreaterThen(foo)``
djmj

164

可能更好的方法

if (value.signum() > 0)

12
BigDecimal.compareTo()通过比较符号作为优化开始。因此,最好调用compareTo(),因为它更具意图,并且只花费额外的方法调用的代价(我怀疑无论如何都会内联)。
Andrew Spencer

27
这是公共API的一部分。对我来说,这是一种更好的方法。意图是确定信号是否为正(即>零)
Marc

您是否认为仅捕获String初始化的第一个字符BigDecimal来查看它是否具有较高的性能-?这是我对它如何工作的最好猜测。似乎可以更快地确定该数字是否为0。这样对吗?提前非常感谢您Anton Bessonov!

5
如果查看反编译BigDecimal.compareTo()方法,您会发现它调用了signum()两次。因此,就性能而言,signum()更好。
2017年

1
您遇到的十进制问题是什么?@jfajunior
伊斯梅尔Yavuz的


0

当您想要检查其grater是否大于零时,在BigDecimal对象上使用“ .intValue()”是不正确的。剩下的唯一选项是“ .compareTo()”方法。


0

使用该方法更安全 compareTo()

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

    System.out.println(" result ==> " + a.compareTo(b));

控制台打印

    result ==> 1

compareTo() 退货

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

现在,对于您的问题,您可以使用

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

要么

if (value.compareTo(new BigDecimal(0)) > 0)

希望对您有所帮助。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.