比较BigDecimal是否大于零

328

如何比较 BigDecimal 值是否大于零?


1
请查看 https://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
9个回答

516

这很简单:

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

compareTo 方法的文档说明它将返回 -1、0 或 1,但更通用的 Comparable<T>.compareTo 方法只保证三种情况中的小于零、等于零或大于零 - 所以我通常只使用这种比较方式。


59
需要额外警告一句话。假设“value”值为零,但比例不为零(例如,它计算出的值为“0.00”,而不是“0”)。您可能希望考虑它是否等于零。compareTo()方法确实会这样做。 但是,equals()方法不会这样做。(如果需要进一步证明的话,可以证明Loki或他的某个化身依然活着并已进入软件开发。) - Andrew Spencer
16
虽然我同意这是Java中惯用的解决方案,但我认为它并不容易理解。每次遇到这样的表达式时,我都会写一个测试来确保自己理解正确。也许最近添加的类(如LocalDate)包括isBefore方法是Oracle公司觉得同样存在这个问题的原因。尽管这不是理想的解决方案,但在这些情况下编写一个实用的isGreaterThan方法可能更加易读。 - Mark Slater
3
@Angelina:我肯定会期望它这么做的- 这些值不大于0,所以我期望compareTo返回0。但是如果你感到担忧,那么测试应该对你来说很容易。 - Jon Skeet
1
最好使用.signum() - fps
@MarkSlater 不要考虑compareTo返回的1和-1,只使用0。这样,比较操作符就像在两个比较的数字之间一样简单。所以value1.compareTo(value2) operator 0与value1 operator value2是相同的。 - undefined
显示剩余2条评论

231

可能更好的方法

if (value.signum() > 0)

signum 方法返回一个 BigDecimal 对象的符号,如果该对象是负数则返回 -1,如果为零则返回 0,如果为正数则返回 1。


13
BigDecimal.compareTo() 方法为了优化会先比较符号。因此最好调用 compareTo(),因为它更能表达意图,且只需要多一个方法调用的代价(我猜测这个调用会被内联)。 - Andrew Spencer
34
这是公共API的一部分。对我来说,这是更好的方式。意图是确定符号是否为正数(即>零)。 - Marc
8
如果你看过反编译后的 BigDecimal.compareTo() 方法,你会发现它调用了两次 signum()。因此,就性能而言,signum() 更好。 - MeIr
3
您对小数位有什么问题?@jfajunior - Ismail Yavuz
4
@İsmailYavuz,对于我不完整的评论表示抱歉!我至少应该写出这些论点的证明,我的错。现在我在寻找发生了什么事情,因为我记得我必须将东西从“signum”更改为“compareTo”,但我不知道为什么。可能是我的错误,因为我进行了几次测试,使用带小数的数字时并没有发现任何问题使用“signum”。 - jfajunior
显示剩余3条评论

16

使用compareTo()方法更安全。

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

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

控制台打印

    result ==> 1

compareTo() 返回

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

现在你可以使用这个方法解决你的问题。

if (value.compareTo(BigDecimal.ZERO) > 0)
或者
if (value.compareTo(new BigDecimal(0)) > 0)

我希望它对你有所帮助。


12

使用内置在该类中的 compareTo() 函数。


1

也许,

BigDecimal a = new BigDecimal(10);
if(a.abs().equals(a)){
   // positive

}else {
   // negative
}

当然,上述内容不包括零的情况。


1
这是 Kotlin 的代码:

value > BigDecimal.ZERO


1
value 是一个 _BigDecimal_,而且 BigDecimal.ZERO 也是。你不能使用 > 来比较 BigDecimals。 - Jan B.
你说得对。我的意思是它在 Kotlin 中可以工作。 - RonaldPaguay

1
在检查BigDecimal对象是否大于零时,使用".intValue()"是不正确的。唯一的选择是使用".compareTo()"方法。

1
就个人而言,我一直使用BigDecimal.ZERO来检查我的值是否大于零(0)。它运行得非常好。我认为这个选项非常适合。或者你可以使用signum(),它也运行得非常好。
        for (int i = 0; i < this.listTypes.size(); i++) {
            if (this.listTypes.get(i).isAutorise()
                    && this.listTypes.get(i).getPlafond() != null
                    && this.listTypes.get(i).getPlafond().compareTo(BigDecimal.ZERO) > 0) {
                this.listTypes.get(i).setProcuration(this.entity);
                this.listTypes.get(i).setActeur(this.entity.getMandataire());
                this.acteurTypeOperationService.addOne(this.listTypes.get(i));
            }
        }

-6
 BigDecimal obj = new BigDecimal("100");
 if(obj.intValue()>0)
    System.out.println("yes");

该“obj”变量保存的是数字字符串,在接受的答案中,其值未被声明,可能会令人困惑。我的回答将更加清晰明了。 - Rama Krishna
1
这是针对任何值的,没有人会根据输入点赞这些简单的东西,但它可能有助于复杂的情况。您正在再次转换为intvalue。因此,转换的成本很高,并且对于0.33,它将转换为int 0,从而导致失败。 - Satish Patro
1
@RamaKrishna,如果我的obj = BigDecimal("0.01")呢?它会打印“yes”吗? - epox

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