java - 如何在Java中使用大双数?

标签 java bigdecimal pi

我找到了使用 BBS 算法计算 Pi 数量的解决方案。但我遇到了一个问题。如果使用双变量,我会丢失精度。有什么建议可以解决吗?

这是我的代码:

public class Pi {
    public static void main(String[] args) {
        int n = 5;

        for (int k = 0; k < n; k++) {
            int a0 = (int) Math.pow(16, k);

            double a1 = (double) 4 / (8 * k + 1);
            double a2 = (double) 2 / (8 * k + 4);
            double a3 = (double) 1 / (8 * k + 5);
            double a4 = (double) 1 / (8 * k + 6);

            double a5 = a1 - a2 - a3 - a4;
            double a6 = (double) 1 / a0;
            double elem = a5 * a6;

            System.out.println(new BigDecimal(elem));
        }
    }
}

最佳答案

如果你需要BigDecimal的精度,您需要将它用于所有计算。仅转换 double 的结果是不够的至BigDecimal最后,因为那时精度已经消失了。

您需要转换所有 aX变量为BigDecimal ,并将运算符替换为对 BigDecimal 的相应方法的调用类:

BigDecimal pi = BigDecimal.ZERO;
for (int k = 0; k < n; k++) {
    BigDecimal a0 = new BigDecimal(16).pow(k);
    BigDecimal a1 = new BigDecimal(4).divide(new BigDecimal(8*k+1), 20, RoundingMode.HALF_UP);
    BigDecimal a2 = new BigDecimal(2).divide(new BigDecimal(8*k+4), 20, RoundingMode.HALF_UP);
    BigDecimal a3 = new BigDecimal(1).divide(new BigDecimal(8*k+5), 20, RoundingMode.HALF_UP);
    BigDecimal a4 = new BigDecimal(1).divide(new BigDecimal(8*k+6), 20, RoundingMode.HALF_UP);
    BigDecimal a5 = a1.subtract(a2).subtract(a3).subtract(a4);
    BigDecimal a6 = BigDecimal.ONE.divide(a0, 20, RoundingMode.HALF_UP);
    pi.add(a5.multiply(a6));
    System.out.println(pi);
}

Demo on ideone .

关于java - 如何在Java中使用大双数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20240275/

相关文章:

java - BigDecimal 与 int 的区别?

java - Java BBP公式中PI的百万元素

python - pi计算中的段错误(python)

java - Spring Cloud Gateway在调用spring oauth2授权服务器时卡住

java - 从末尾开始 SubString 一个 URL?

java - 如何在Java中设置BigDecimal的特定精度?

r - 如何在 RcppEigen 中使用 pi?

javascript - 无法让 BBP 公式在 nodejs 中工作

Java正则表达式用点替换css类字符串中的空格

Java "implement interface"?