我看到一些将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类型有何不同?
发生这种情况是因为MAX_VALUEof int是2147483647。您也可以替换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,它将开始溢出,最终将变为负值。
| 归档时间: |
|
| 查看次数: |
369 次 |
| 最近记录: |