如何在java中编写1 + 1/2 + 1/3 .... + 1/4999 + 1/5000?

时间:2011-08-01 07:02:14

标签: java double

如何在java中编写1 + 1/2 + 1/3 .... + 1/4999 + 1/5000? 我试过这个但是没有用。

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

8 个答案:

答案 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

答案 1 :(得分:13)

1是一个int常量,所以1 /(大于1的任何int)是0.你需要指定你想要一个浮点除法,使用1.0(float):

sum+=1.0/i;
      ^

答案 2 :(得分:6)

这是一个家庭作业,然后我只是帮你提示:小心变量类型。如果我们将其视为整数,则1/10等于0.

答案 3 :(得分:4)

请改为尝试:

sum += 1.0 / i;

答案 4 :(得分: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);
  }
}

答案 5 :(得分:3)

因为我是一个int所以该分区将被截断...尝试放sum+ = 1/(double)i

答案 6 :(得分:3)

在第一次迭代后,1/i将始终为0,因为它是在整数运算中完成的。因此,您的最终答案只是1.将其更改为1.0/i以获得双重算术,并记住,当您完成循环时,由于使用双精度时精度损失,您可能会有相当多的错误。你可以尝试一下,看看它有多准确。

答案 7 :(得分:0)

用于计算谐波和的

解决方案:

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