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
相关产品推荐
相关产品推荐

