Java:为什么将大正数相乘会导致负数结果?

C. *_*eck 3 java math types

我看到一些将Java与整数相乘的奇怪行为。我正在做一些编码练习,然后进行了以下嘶嘶声类型的练习。要求:给定一个整数,编写一个函数,该函数查找3的每个乘积的乘积,该乘积小于给定的整数(5的任何乘积除外)。例如,给定17,我们要返回12 * 9 * 6 * 3(= 1944年)。我写了以下内容:

public int findProduct(int limit) { 
    int product = 1;
    for(int n = 3; n < limit; n = n + 3) {
        if (n % 5 != 0) {
            product = product * n;
        }
    }
    return product;
}
Run Code Online (Sandbox Code Playgroud)

这适用于少量数字。但是在测试中,我发现一旦达到33以上,返回值就会消失。例如,如果我调用限制为36的函数,则它将返回-1.466221696E9。这就是我感到困惑的地方。我乘以整数,结果某种程度上是负的。

但是,我发现,如果声明一个double值,它似乎总是会返回正确的结果。

public double findProduct(int limit) { 
    double product = 1;
    for(int n = 3; n < limit; n = n + 3) {
        if (n % 5 != 0) {
            product = product * n;
        }
    }
    return product;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么整数会发生这种情况?使得double类型正确执行的double类型有何不同?

Ani*_*wat 5

发生这种情况是因为MAX_VALUEof int2147483647。您也可以替换int使用long,以获得预期的结果。

System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Long.MAX_VALUE); // 9223372036854775807
System.out.println(Double.MAX_VALUE); // 1.7976931348623157E308
Run Code Online (Sandbox Code Playgroud)

一旦Integer达到MAX_VALUE,它将开始溢出,最终将变为负值。