1

在 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

4

2 回答 2

1

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

于 2013-07-05T10:58:13.980 回答
1

在对您的值求和后应用不同的四舍五入和四舍五入会double产生这些结果。如hereBigDecimal所述,如果精度应该准确,您可能应该使用。

于 2013-07-05T10:58:45.567 回答