Java总是给我错误的数字

时间:2017-09-20 13:23:55

标签: java numbers

我写了这行代码:

class C extends B
val z = test2("", new B, new C) // doesn't compile; can't prove B =:= C
val w = test2[B, B]("", new B, new C) // does compile

我希望输出为System.out.println(Math.pow(7, 23) % 143); // 7^23 mod 143 ,但输出为2。有人知道我做错了吗?

3 个答案:

答案 0 :(得分:7)

数字“溢出”double,这是Math.pow()期望并返回的内容。改为使用BigInteger

BigInteger.valueOf(7)
        .pow(23)
        .mod(BigInteger.valueOf(143))

或者只需一步,如@Felk所建议的那样:

BigInteger.valueOf(7)
        .modPow(BigInteger.valueOf(23), BigInteger.valueOf(143))

答案 1 :(得分:3)

Math.pow的结果是double,其中有64位;其中53个是尾数位。这意味着任何大于2^53-1 = 9007199254740991的整数都不能精确地表示为double。

7 ^ 23大于2 ^ 53-1(实际上它仅略大于2 ^ 64),因此无法精确表示。因此,%的结果不是您所期望的。

使用BigInteger,而@Costi已经建议。

答案 2 :(得分:0)

如果中间取幂结果太大而无法容纳变量,请使用Modular exponentiation algorithm

System.out.println(powMod(7, 23, 143)); // = 2

// Example from Wikipedia with minor changes
private static int powMod(int base, int exponent, int modulus) {
    if (modulus == 1)
        return 0;

    base %= modulus;
    int result = 1;
    while (exponent > 0) {
        if ((exponent & 1) == 1)
            result = (result * base) % modulus;
        exponent >>= 1;
        base = (base * base) % modulus;
    }
    return result;
}