如何在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);
}
}
答案 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)
java-8解决方案:
public static double harmonicSum(int n) {
return IntStream.rangeClosed(1, n)
.mapToDouble(i -> (double) 1 / i)
.sum();
}