来自Math.pow(65,17)%3233的令人惊讶的结果

时间:2012-12-15 22:00:17

标签: java double modulo largenumber

出于某种原因处理大数字时,模数运算符并没有给我正确的输出,看看代码

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

输出应为2790 但输出为887.0

我确定它的东西很傻但我无法绕过它。提前致谢

2 个答案:

答案 0 :(得分:7)

Math.pow(65, 17)的结果不能完全表示为double,而是四舍五入到最接近的数字。

pow(a, b) % c操作称为“模幂运算”。 Wikipedia page包含了很多关于如何计算它的想法。

这是一种可能性:

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

答案 1 :(得分:1)

您可以像这样使用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