为什么改变数据类型会改变整个结果?
Why changing the data type changing the whole result?
我写了一个程序来计算1
和100
之间的奇数乘法。那么为什么改变数据类型会给我一个完全不同的输出呢?为什么我用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);
旁注:与其遍历 1
和 100
之间的所有 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);
我写了一个程序来计算1
和100
之间的奇数乘法。那么为什么改变数据类型会给我一个完全不同的输出呢?为什么我用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);
旁注:与其遍历 1
和 100
之间的所有 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);