从左到右,从右到左计算谐波和的不同值

时间:2013-07-05 10:40:12

标签: java double-precision

当在两个方向上计算java中1到50000的数字的谐波和时,所获得的值必须匹配,但我想他们不这样做! 请告诉我为什么会这样。

public class Main {
    public static void main(String args[]){
        int maxD = 50000;
        double suml2r=0, sumr2l=0;
        for(int i=1; i<=maxD; i++){
            suml2r += (double)(1)/i;
            sumr2l += (double)(1)/(maxD-i+1);
        }

        System.out.println("left to right = " + suml2r);
        System.out.println("right to left = " + sumr2l);
    }
}

输出:
从左到右= 11.397003949278504
从右到左= 11.397003949278519

2 个答案:

答案 0 :(得分:1)

浮点不准确!在从右到左的总和中,您将从最小到最大添加,并且最不重要的残余具有累积的变化,这与从左到右的总和不同,其中对于最小的添加数字,需要丢弃较长部分的尾数。有一个原因,为什么相等检查确切的浮点值通常是一个坏主意。

答案 1 :(得分:1)

在总结double值后应用不同的舍入和舍入结果会产生这些结果。正如here所解释的那样,如果精度应该准确,你应该使用BigDecimal