【发布时间】:2019-03-24 11:09:12
【问题描述】:
我看到一些用 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;
}
这适用于小数字。然而,在测试中我发现一旦你以某种方式超过 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;
}
我的问题是:为什么整数会发生这种情况,双精度类型有什么不同使其正确执行?
【问题讨论】:
-
超过 Double.MAX_VALUE ,所以最左边的位是'1',这就是为什么值为负数