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

标签 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);
  }
}

最佳答案

将数字从小到大相加将具有较低的舍入误差。如果以更高的精度比较结果,您会发现小到大更接近。

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

关于java - 如何在java中编写1+1/2+1/3....+1/4999+1/5000?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6895117/

相关文章:

Java转换为公里

c++ - 如何使用 double 更安全和精确?

java - 在Java中设置进度条

Java:Face 无法创建 PoolableConnectionFactory(用户 'root ' @'localhost' 的访问被拒绝(使用密码:YES))异常

java - 将子字符串的 jdk6 更改为 jdk7 行为的解决方法

c++ - `int` 与 `double` 的问题 - 为什么我的程序不工作?

java - 用于 Mac 的简单 Java IDE?

java - log4j 创建日志文件,但不写入我正在创建的消息

PHP PDO 双插入

Java 最大打印 double 和整数