【问题标题】:Why changing the data type changing the whole result?为什么改变数据类型会改变整个结果?
【发布时间】:2021-12-05 12:53:51
【问题描述】:

我编写了一个程序来计算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

【问题讨论】:

  • 另外,您可能希望在for 循环内添加一个System.out.println(total);,以查看在执行for 循环时值如何变化。
  • 这能回答你的问题吗? Overflow occurs with multiplication
  • @QusayAbuAuda total 的实际结果为2725392139750729502980713245400918633290796330545803413734328823443106201171875,但long 类型的上限为9223372036854775807,因此无法将结果存储在long 类型变量中.
  • @QusayAbuAuda 结果也不能保存在 double 类型变量中,因为 double 的精度约为 15 位,但这个数字有 ~78 位。 double 类型变量中的值不能精确地保存该值。

标签: java multiplication


【解决方案1】:

使用不同的数据类型,结果会以不同的方式overflow。使用double 时的结果看起来是正确的,尽管您可能在那里失去了很多精度。如果你想正确地乘以任意大小的整数,你应该使用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 开始,然后将每次迭代递增 2 而不是1:

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

【讨论】:

  • 为什么使用 long 不正确?
  • @QusayAbuAuda 该值对于long 类型来说太大了。
  • @QusayAbuAuda 程序的回复是正确的——值太大了,连一个long都会溢出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 2018-06-05
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 2011-05-12
相关资源
最近更新 更多