2010-11-04 131 views
20
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值。我想知道哪种方法是正确的。鉴于上面的代码应该使用哪一个?原来的代码是在顶端..我想改变它的第二种方法。Java,比较BigInteger值

回答

32

,如果你想测试,如果BigInteger的具有阳性值的第一种方法是错误的:longValue刚刚返回低位64位可以恢复符号..因此,对于一个积极的BigInteger,测试可能会失败。

第二种方法更好(请参阅Bozhos answer进行优化)。

另一种选择:BigInteger#signum返回1如果值为正:

if (bigInteger.signum() == 1) { 
// bigger than 0 
} 
+0

感谢您的提示,但你的意思是'大_than_ 0'对吗? Just nitpicking ..:p – 2010-11-04 14:49:37

+12

@Rosdi - 当然,“比”。 Somatimas tha'e'end tha'a'kay chenga plecas on my kayboerd ;-) – 2010-11-04 15:27:14

26

如果您使用的是BigInteger,则假定您需要比long可以处理的更大的数字。所以不要使用longValue()。使用compareTo。随着你的榜样它最好是:

if (bigInteger.compareTo(BigInteger.ZERO) > 0) { 

} 
+5

真(+1),但检查'> 0',没有'== 1'(见我的回答) – 2010-11-04 09:12:11

+0

@seanizer - 只是固定的,和+1你对哪个答案。 – Bozho 2010-11-04 09:12:48

12

这不是一个直接的答案,但关于使用的compareTo一个重要的注意事项()。

当检查compareTo()的值时,总是测试x < 0x > 0x == 0
不要为x == 1

Comparable.compareTo()的javadoc测试:

比较此对象与指定对象的顺序。返回负整数,零或正整数,因为此对象小于,等于或大于指定的对象。

注:

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

+0

'BigInteger.compareTo()'的规范明确说'-1,0和1',但我同意使用'x < 0','x == 0','x> 0'感觉更直观,而不是'x == -1','x == 0','x == 1'。 – 2010-11-04 14:53:21

+0

@Rosdi,但它也表示*执行这些比较的建议成语是:('x.compareTo(y) 0'),其中''是六个比较运算符之一。* – 2010-11-04 14:56:05