【问题标题】: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 等的功能之外,它与泛型完全不同。

标签: java compare bigdecimal


【解决方案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
        猜你喜欢
        • 2023-03-14
        • 2014-02-26
        • 2011-03-20
        • 2020-07-27
        • 2014-04-23
        • 2016-01-05
        • 1970-01-01
        • 1970-01-01
        • 2023-02-04
        相关资源
        最近更新 更多