类似方法的结果不同

时间:2017-01-23 15:21:50

标签: java math

在我的课堂上,我尝试以两种方式返回2^n + 2^(n+1) + 2^(n+2) ...的总和。 在第一种方法中迭代,在第二种方法中递归。

只要数字不是太大,这就有效。有人可以向我解释为什么这些方法在使用高数字时会返回不同的答案吗?

public class Power
{
    public static void main(String[] args)
    {       
        System.out.println(iterativ(3));
        System.out.println(rekursiv(3));

        System.out.println(iterativ(40));
        // The recursive one is lower by 10
        System.out.println(rekursiv(40));
    }

    public static int iterativ(int x)
    {
        int sum = 0;
        for (int i = 0; i <= x; i++) {
            sum += Math.pow(2, i);
        }
        return sum;
    }

    public static int rekursiv(int x)
    {           
        if (x > 0) {
            return ((int) Math.pow(2, x) + rekursiv(x - 1));
        }
        return 1;
    }
}

1 个答案:

答案 0 :(得分:3)

您正在使用处理double的函数。您正在将值转换为int。如果您从double投射到int,则投射值迟早会导致一些不准确的结果,更是如此。

使用40作为指数时所看到的数字是2147483647,实际上是Integer.MAX_VALUE,但不是2^40。而是2^31-1。 java教程有一章关于the primitive datatypes,它向您展示了每种类型的范围。

除了使用double之外,您可能还想查看BigDecimal