Java,比较BigInteger值

Ros*_*sim 22 java

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
}
Run Code Online (Sandbox Code Playgroud)

我需要比较一些任意的BigInteger值.我想知道哪种方法是正确的.鉴于以上代码应该使用哪一个?原始代码位于顶部..我正在考虑将其更改为第二种方法.

And*_*s_D 35

如果你想测试BigInteger是否有一个正值,第一种方法是错误的:longValue只返回低位64位,这可能会恢复符号......所以测试可能会失败,因为正的BigInteger.

第二种方法更好(参见Bozhos的优化答案).

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

if (bigInteger.signum() == 1) {
 // bigger than 0
}
Run Code Online (Sandbox Code Playgroud)

  • @Rosdi - 当然,"比".在我的kayboerd上,所谓的'smatimas''结束了'kay chenga plecas ;-) (13认同)

Boz*_*zho 25

如果您正在使用BigInteger,则假设您需要的数字大于long可以处理的数字.所以不要使用longValue().使用compareTo.有了你的例子,最好是:

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

}
Run Code Online (Sandbox Code Playgroud)

  • 真(+1),但检查"> 0",而不是"== 1"(参见我的回答) (5认同)

Sea*_*oyd 13

这不是直接的答案,而是关于使用compareTo()的重要说明.

检查compareTo()的值时,请始终测试x < 0,x > 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;
}
Run Code Online (Sandbox Code Playgroud)

但它仍然是不好的做法,并在JavaDocs中明确推荐:

将此BigInteger与指定的BigInteger进行比较.对于六个布尔比较运算符(<,==,>,> =,!=,<=)中的每一个,优先考虑该方法.建议用于执行这些比较的习惯用法是:( x.compareTo(y) <op> 0),其中<op>六个比较运算符之一.