比较 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 是不是大于零的主要内容,如果未能解决你的问题,请参考以下文章