Java Math.pow 的错误结果

2022-09-04 08:05:24

如果您尝试运行以下代码

public class Main {
   public static void main(String[] args) {
       long a = (long)Math.pow(13, 15);
       System.out.println(a + " " + a%13);
   }
}

您将获得“51185893014090752 8”

正确的值 13^15 51185893014090757,即大于返回的结果 5。任何可能导致它的想法?Math.pow


答案 1

您已超过双精度浮点值中可用的有效位数(~15 到 16)。一旦你这样做了,你就不能指望你的结果中最低有效位数实际上是有意义/精确的。

如果您需要在 Java 中任意精确的算术,请考虑使用 和 。BigIntegerBigDecimal


答案 2

问题是,当你得到越来越高的值时,连续值之间的差距会增加 - a不能表示其范围内的每个整数值,这就是这里的问题所在。它返回最接近确切结果的值。doubledoubledouble