2013-07-05 53 views
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

+1

这是可以预料的,因为浮点值不是数字的精确表示。可能有[100多个类似的问题](http://stackoverflow.com/questions/tagged/floating-point)。你也许应该读一些类似于[每个计算机科学家应该知道的关于浮点运算的东西]](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)和/或[“二进制浮点和.NET”](http://csharpindepth.com/Articles/General/FloatingPoint.aspx)(后者是C#,但同样适用于Java)。 – Dukeling

+2

用'0.1 + 0.2 + 0.3'和'0.3 + 0.2 + 0.1'得到同样的问题。围绕添加每一对数字,你会更好地了解它为什么会发生。 – Tom

回答

1

浮点不准确的!在从左至右的总和中,您将从最小值增加到最大值,最不重要的残值会累积变化,这与从左到右的总和不同,尾数的较长部分需要为最小的添加数减少。为什么平等检查确切的浮点值通常是一个坏主意,这是有原因的。

1

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

相关问题