从Math.pow令人惊讶的结果(65,17)%3233(Surprising result fro

2019-08-04 03:48发布

对于有大量打交道时的一些原因,模运算符犯规给我正确的输出,看看代码

double x = Math.pow(65,17) % 3233;

输出应该是2790 ,但输出为887.0

我相信它的一些愚蠢的,但我不能绕过它。 提前致谢

Answer 1:

的结果Math.pow(65, 17)不能被精确地表示为一个double ,并且越来越四舍五入到最接近的数即可。

pow(a, b) % c操作称为“模幂”。 在维基百科页面包含了很多的想法,你会如何去计算它。

这是一种可能性:

public static int powmod(int base, int exponent, int modulus) {
    if (exponent < 0)
        throw new IllegalArgumentException("exponent < 0");
    int result = 1;
    while (exponent > 0) {
        if ((exponent & 1) != 0) {
            result = (result * base) % modulus;
        }
        exponent >>>= 1;
        base = (base * base) % modulus;
    }
    return result;
}


Answer 2:

您可以使用int这样

int n = 65;
for (int i = 1; i < 17; i++)
    n = n * 65 % 3233;
System.out.println(n);

或者喜欢的BigInteger

System.out.println(BigInteger.valueOf(65).pow(17).mod(BigInteger.valueOf(3233)));

两个打印

2790


文章来源: Surprising result from Math.pow(65,17) % 3233