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 < 0x > 0x == 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 ),其中是六个比较运算符之一。