比较 BigDecimal 是不是大于零

Posted

技术标签:

【中文标题】比较 BigDecimal 是不是大于零【英文标题】:Compare if BigDecimal is greater than zero比较 BigDecimal 是否大于零 【发布时间】:2011-05-09 01:11:05 【问题描述】:

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

【问题讨论】:

查看github.com/mortezaadi/bigdecimal-utils 有一个方法isPositive() 还有类似is(bigdecimal).isZero(); is(bigdecimal).notZero(); is(bigdecimal).isPositive(); // 大于零 is(bigdecimal).isNegative(); // 小于零 is(bigdecimal).isNonPositive(); // 小于或等于零 is(bigdecimal).isNonNegative(); @MortezaAdi 因为BigDecimal 实现了Comparable 比较函数,如lt, le, eq, ne 最好移动到ComparableUtils。因此它们可以用于任何其他类,例如 Date 或自定义类型。 @djmj 要求定义了实现,没有必要也没有打算构建 ComparableUtils。除了 lt、le、eq 等的功能之外,它与泛型完全不同。 【参考方案1】:

很简单:

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

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

【讨论】:

需要额外的警告。假设value 的值为零但比例非零(例如,它的计算结果为0.00 而不是0)。您可能想考虑它等于零。 compareTo() 方法确实可以做到这一点。 equals() 方法不会。(如果需要,另一个证明 Loki 或他的一个化身还活着,并且已经进入软件开发领域。) 虽然我同意这是 Java 中惯用的解决方案,但我认为它实际上并不可读。每次我遇到这样的表达方式时,我都会发现自己正在编写一个测试来让自己确信我的方法是正确的。也许最近添加的类,如LocalDate 包括isBefore,这表明Oracle 也有同样的感受。这并不理想,但我认为在这种情况下编写实用程序isGreaterThan 方法更具可读性。 如果值为 0.00 或 0.0,@Jon Skeet 解决方案是否也有效 @Angelina:我希望它,当然 - 这些值 大于 0,所以我希望 compareTo 返回 0。但如果你很担心,你应该很容易测试。 @MarkSlater 我同意,compareTo 只是 Java 应该投入更多时间来提高可读性,如果每个人都必须在每个项目中创建自己的可读方法是没有意义的。在 C# 中,您还可以为现有类创建扩展方法,因此您可以直接使用 `value.isGreaterThen(foo)`【参考方案2】:

Possible better way:

if (value.signum() > 0)

signum 返回 -1、0 或 1,因为此 BigDecimal 的值为负、零或正。

【讨论】:

BigDecimal.compareTo() 首先比较符号作为优化。所以最好调用 compareTo(),因为它更能揭示意图,并且只花费额外方法调用的代价(我怀疑无论如何都会内联)。 这是公共 API 的一部分。所以,对我来说,这是一个更好的方法。目的是确定符号是否为正(即>零) 如果你查看反编译的BigDecimal.compareTo()方法,你会发现它调用了两次signum()。所以就性能而言,signum() 更好。 小数大小写有什么问题? @jfajunior @İsmailYavuz 对于不完整的评论,我深表歉意!我至少应该写一个论据的证明,我的错。现在我正在寻找发生了什么,因为我记得我必须将事情从“signum”更改为“compareTo”,但我不知道为什么。这可能是我的错误,因为我现在做了几次测试,我没有发现使用带小数的数字的“signum”有任何问题。【参考方案3】:

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

【讨论】:

【参考方案4】:

使用compareTo()的方法更安全

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

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

控制台打印

    result ==> 1

compareTo() 返回

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

现在你可以使用你的问题

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

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

希望对你有帮助。

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

这适用于 Kotlin

值 > BigDecimal.ZERO

【讨论】:

value 是一个 BigDecimal,BigDecimal.ZERO 也是如此。您不能将 BigDecimals 与 >. 进行比较 你是对的。我的意思是它在 Kotlin 中工作【参考方案7】:
 BigDecimal obj = new BigDecimal("100");
 if(obj.intValue()>0)
    System.out.println("yes");

【讨论】:

obj 包含数字字符串,在接受的答案中未声明值,可能会造成混淆。我的回答会更清楚。 它适用于任何价值,没有人会根据输入对这个简单的事情进行投票,它可能有助于复杂的场景。您正在再次转换为 intvalue 。所以转换成本,这将在 0.33 失败,因为它将转换为 int 0

以上是关于比较 BigDecimal 是不是大于零的主要内容,如果未能解决你的问题,请参考以下文章

Double值保留两位小数的四种方法

BigDecimal 怎么比较大小

BigDecimal比较大小用啥方法?

BigDecimal 基本使用 比较大小和加减乘除

BigDecimal 基本使用 比较大小和加减乘除

BigDecimal 类型数据的一些应用