【问题标题】:The Weird BigInteger.mod Modulus Method奇怪的 BigInteger.modulus 方法
【发布时间】:2014-05-19 05:28:09
【问题描述】:

在Java中,我们知道如果要比较两个引用对象,我们通常需要使用equals,但是在这里我对以下输出感到很困惑:

System.out.println(new BigInteger("0") == BigInteger.ZERO);                     // false
System.out.println(new BigInteger("0").mod(BigInteger.ONE) == BigInteger.ZERO); // true

为什么第二个说法是正确的?

【问题讨论】:

  • == 是邪恶的,有时会诱使您相信它有效。只是不要注意它的输出。

标签: java biginteger modular


【解决方案1】:

花了一些时间,但按照执行的逻辑路径将我们带到:

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)

【讨论】:

    【解决方案2】:

    它是三种方法的实现:

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多