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.
另一种选择:如果值为正则BigInteger#signum返回1:
if (bigInteger.signum() == 1) {
// bigger than 0
}
Run Code Online (Sandbox Code Playgroud)
Boz*_*zho 25
如果您正在使用BigInteger,则假设您需要的数字大于long可以处理的数字.所以不要使用longValue().使用compareTo.有了你的例子,最好是:
if (bigInteger.compareTo(BigInteger.ZERO) > 0) {
}
Run Code Online (Sandbox Code Playgroud)
Sea*_*oyd 13
这不是直接的答案,而是关于使用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;
}
Run Code Online (Sandbox Code Playgroud)
但它仍然是不好的做法,并在JavaDocs中明确推荐:
将此BigInteger与指定的BigInteger进行比较.对于六个布尔比较运算符(<,==,>,> =,!=,<=)中的每一个,优先考虑该方法.建议用于执行这些比较的习惯用法是:(
x.compareTo(y) <op> 0),其中<op>六个比较运算符之一.