为什么这会归还无限? (JAVA)

时间:2017-03-21 16:00:28

标签: java math types casting type-conversion

我试图找到1/1 + 1/4 + 1/9 + 1/16 + 1/25 ......

的结果

这些是我写的给出结果Infinity

的行
public class BaselProblem {
    public static void main(String[] args) {
        int testLimit = 100000;
        double sum = 0;
        for (int i = 1; i<testLimit; i++) 
        {
            sum = sum + 1.0/(i*i);
        }
        System.out.println(sum);
    }
}

1.0/(i*i)更改为1/(1.0*i*i)会得到正确的结果1.6449240667982423。为什么只有第二种形式起作用但不起作用?

另外,因为(i*i) > 11.0/(i*i)应该是< 1,那么它如何导致Infinity

2 个答案:

答案 0 :(得分:6)

因为您的testLimit以及i被定义为int。由于您将表达式i*i放在括号中,它将首先计算,并尝试找到两个整数的倍数 - 这将很快达到溢出并重置为零。

具体而言,当i达到2 15时,i*i将为2 32。这意味着1后跟32个二进制零,其中只保留32个零,这意味着零。 (谢谢@templatetypedef)。

因此,您将有一个除以零的数字,即无穷大。

更改循环声明,以使idouble。或者在i*i左手上乘以double(1.0)。这将导致表达式在乘以第二个double之前更改为i

答案 1 :(得分:2)

Java整数的最大值为2,147,483,647。你最终会用i * i产生的整数超过那个最大值。

如果你做1.0 * i * i,你将结果转换为一个双倍,它可以保持最大值1.79769313486231570E + 308。

i * i的最大值为10,000,000,双倍可以容纳,但整数不能。