You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中使用Modulo 10^9+7对大long数取模结果错误如何解决

问题原因
  • Math.pow 方法的返回值是双精度浮点数(double),double类型仅能精确表示不超过253的整数,而`9^212`是远大于253的超大整数,计算过程中已经出现了精度丢失,得到的数值本身就不是9^212的准确值,后续强制转long再取模的结果自然不符合预期。
解决方法

使用模幂运算(快速幂)逻辑计算,每一步乘法后立即取模,既不会出现数值溢出,也不会丢失精度,有两种常用实现方案:

方案1:手动实现快速幂

long M = 1000000007;
int num = 212;
int val = 9;
long sol = 1;
long base = val % M;
while (num > 0) {
    // 指数为奇数时,把当前base乘入结果
    if (num % 2 == 1) {
        sol = (sol * base) % M;
    }
    base = (base * base) % M;
    num /= 2;
}
// 最终sol的值为预期的541416750

方案2:使用JDK内置的BigInteger工具

import java.math.BigInteger;

long M = 1000000007;
int num = 212;
int val = 9;
long sol = BigInteger.valueOf(val)
        .modPow(BigInteger.valueOf(num), BigInteger.valueOf(M))
        .longValue();

内容的提问来源于stack exchange,提问作者Saurav Shrivastav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 08:09:02