我在使用Java计算整数乘法时发现了一些奇怪的行为。 我正在做一些编码练习,并遇到以下类型的fizz buzz问题。要求:给定一个整数,编写一个函数,查找小于给定整数的每个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;
}
这在处理小数时是有效的。但是,经过测试发现,一旦超过33,返回值就会出现严重偏差。例如,如果我使用限制36调用函数,则返回-1.466221696E9。这使我感到困惑。我正在乘以正整数,结果却变成了负数。
然而,我发现如果声明一个双精度浮点类型,它似乎总是返回正确的结果。
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;
}
我的问题是:为什么整数会出现这种情况,而双精度类型有何不同使其能够正确执行?