2013-07-05 73 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

相關問題