Java,比较BigInteger值
BigInteger bigInteger = ...; if(bigInteger.longValue() > 0) { //original code //bigger than 0 } //should I change to this? if(bigInteger.compareTo(BigInteger.valueOf(0)) == 1) { //bigger than 0 }
我需要比较一些任意的BigInteger值。 我想知道哪种方法是正确的。 鉴于以上代码应该使用哪一个? 原始代码位于顶部..我正在考虑将其更改为第二种方法。
如果你想测试BigInteger是否有一个正值,第一种方法是错误的: longValue
只返回低位64位 ,这可能会恢复符号……所以测试可能会因为正BigInteger而失败。
第二种方法更好(参见Bozhos的优化答案 )。
另一种选择:如果值为正,则BigInteger#signum
返回1
:
if (bigInteger.signum() == 1) { // bigger than 0 }
如果您使用的是BigInteger
,则假定您需要的数字比long
可以处理的数字要大。 所以不要使用longValue()
。 使用compareTo
。 有了你的例子,最好是:
if (bigInteger.compareTo(BigInteger.ZERO) > 0) { }
这不是直接的答案,而是关于使用compareTo()的重要说明。
检查compareTo()的值时,始终测试x < 0
, x > 0
和x == 0
。
不要测试x == 1
从Comparable.compareTo() javadocs:
将此对象与指定的对象进行比较以获得顺序。 返回负整数,零或正整数,因为此对象小于,等于或大于指定对象。
注意:
-
A negative integer
,不是-1
。 -
A positive integer
,而不是1
。
没错,检查==1
和==-1
适用于BigInteger
。 这是BigInteger.compareTo()
代码:
public int compareTo(BigInteger val) { if (signum == val.signum) { switch (signum) { case 1: return compareMagnitude(val); case -1: return val.compareMagnitude(this); default: return 0; } } return signum > val.signum ? 1 : -1; }
但它仍然是不好的做法,并在JavaDocs中明确推荐:
将此BigInteger与指定的BigInteger进行比较。 对于六个布尔比较运算符(<,==,>,> =,!=,<=)中的每一个,优先考虑该方法。 建议执行这些比较的习惯用法是:(
x.compareTo(y)
),其中0 是六个比较运算符之一。