在Java中,我们知道如果我们想要比较两个引用对象,我们通常需要使用equals
,但在这里我对以下输出感到困惑:
System.out.println(new BigInteger("0") == BigInteger.ZERO); // false
System.out.println(new BigInteger("0").mod(BigInteger.ONE) == BigInteger.ZERO); // true
为什么第二个陈述是真的?
答案 0 :(得分:5)
花了一段时间,但遵循执行的逻辑路径将我们带到:
MutableBigInteger#toBigInteger(int sign)
其中有以下声明:
BigInteger toBigInteger(int sign) {
if (intLen == 0 || sign == 0)
return BigInteger.ZERO;
return new BigInteger(getMagnitudeArray(), sign);
}
因此,在这种情况下,返回常量BigInteger.ZERO
,因此该语句为真。
堆栈追踪:
BigInteger#mod(BigInteger)
BigInteger#remainder(BigInteger)
BigInteger#remainderKnuth(BigInteger)
MutableBigInteger#toBigInteger(int)
答案 1 :(得分:0)
它是一个三方法实现:
public BigInteger mod(BigInteger m) {
if (m.signum <= 0)
throw new ArithmeticException("BigInteger: modulus not positive");
BigInteger result = this.remainder(m); // call remainder()
return (result.signum >= 0 ? result : result.add(m));
}
public BigInteger remainder(BigInteger val) {
MutableBigInteger q = new MutableBigInteger(),
a = new MutableBigInteger(this.mag),
b = new MutableBigInteger(val.mag);
return a.divide(b, q).toBigInteger(this.signum); // call toBigInteger()
}
BigInteger toBigInteger(int sign) {
if (intLen == 0 || sign == 0)
return BigInteger.ZERO; // here is your answer.
return new BigInteger(getMagnitudeArray(), sign);
}