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

Vũ *_*hĩa 3 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

而且,因为(i*i) > 1,那么1.0/(i*i)应该是,那又< 1怎么会导致Infinity呢?

Rea*_*tic 6

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

具体来说,当i达到2 15时,i*i将是2 3 2 .这意味着1后跟32个二进制零,其中只保留32个零,这意味着零.(谢谢@templatetypedef).

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

改变你的循环声明,以便idouble.或双(1.0)在乘左手i*i.这将导致表达式double 乘以秒之前被更改为i.

  • 具体地,当i = 2 ^ 16时,则i*i = 2 ^ 32,其(模2 ^ 32)等于零. (2认同)