2011-08-01 88 views

回答

3

如何:

public class Harmonic{ 
    public static void main(String[] args){ 
    double sum = 0; 
    for(int i=1; i<=5000; i++){ 
     sum+=1.0/(double)i; 
    } 
    System.out.println(sum); 
    } 
} 
+3

你不需要的'/'是雙打兩個操作數。 – sje397

+0

@sje哦,你知道什麼哈哈。我一定很累 – Paulpro

+0

的確如此,但我認爲這樣更明確一點,那就是雙重打分。 –

3

,因爲我是一個int這樣的劃分將被截斷......嘗試把sum+ = 1/(double)i

13

1是一個整型常量,所以1 /(INT任何大於1)爲0.您需要通過使用1.0(float)指定要浮點除法:

sum+=1.0/i; 
    ^
+2

禮貌的評論:我編輯這個表示「任何大於1的int」 - 它最初表示「任何大於0的int」,這是錯誤的。 1/1不是0. :) – Cowan

+0

@Cowan - 謝謝,這是錯誤的。 – MByD

4

試試這個:

sum += 1.0/i; 
3

第一次迭代1/i後,將始終爲0,因爲它在整數運算來完成。因此,你的最終答案將只是1.將其更改爲1.0/i以獲得雙重算術,並且請記住,當您完成循環時,由於在使用雙打時丟失精度,可能會有相當數量的錯誤。你可以嘗試一下,看看它有多準確。

6

這是一個家庭作業,然後我只是幫助你一個提示:小心變量類型。如果我們把它看作一個整數,1/10等於0。

16

從最小到最大添加數字的舍入誤差會更低。如果將結果與更高的精度進行比較,則可以看到越小越接近。

double sum = 0; 
for (int i = 1; i <= 5000; i++) { 
    sum += 1.0/i; 
} 
System.out.println("From largest to smallest " + sum); 

double sum2 = 0; 
for (int i = 5000; i >= 1; i--) { 
    sum2 += 1.0/i; 
} 
System.out.println("From smallest to largest " + sum2); 

BigDecimal sum3 = BigDecimal.ZERO; 
for (int i = 5000; i >= 1; i--) { 
    sum3 = sum3.add(BigDecimal.ONE.divide(BigDecimal.valueOf(i), 30, BigDecimal.ROUND_HALF_UP)); 
} 
System.out.println("BigDecimal    " + sum3); 

打印

From largest to smallest 9.094508852984404 
From smallest to largest 9.09450885298443 
BigDecimal    9.094508852984436967261245533401 
+4

+1用於指出修正其整數除法後可能的舍入錯誤。 – Bringer128

0

計算諧波和解決方案:

public static double harmonicSum(int n) { 
    return IntStream.rangeClosed(1, n) 
       .mapToDouble(i -> (double) 1/i) 
       .sum(); 
}