为什么改变数据类型会改变整个结果?

Why changing the data type changing the whole result?

我写了一个程序来计算1100之间的奇数乘法。那么为什么改变数据类型会给我一个完全不同的输出呢?为什么我用int输出的是负数?此外,其他结果似乎很奇怪。 代码:

long total = 1L;
for (int i = 1; i <= 100; i++) {
    if (i % 2 != 0) {
        total *= i;
    }
}
System.out.println(total);

不同情况下的输出:

5196472710489536419(如果总数为 long

-373459037(如果总数是 int

2.7253921397507295E78(如果总数为 double

无穷大(如果总数为 float

使用不同的数据类型,结果将是 overflow in different ways. The result when using a double looks correct, although you're probably losing a lot of precision there. If you want to properly multiply an integer of arbitrary size, you should probably use a BigInteger:

BigInteger total = BigInteger.ONE;
for (int i = 1; i <= 100; i++) {
    if (i % 2 != 0) {
        total = total.multiply(BigInteger.valueOf(i));
    }
}
System.out.println(total);

旁注:与其遍历 1100 之间的所有 int 并检查它们是否为奇数,不如从 1 和然后将每次迭代递增 2 而不是 1:

BigInteger total = BigInteger.ONE;
for (int i = 1; i < 100; i+=2) {
    total = total.multiply(BigInteger.valueOf(i));
}
System.out.println(total);