2011-08-01 89 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(); 
}