作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我找到了使用 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);
}
关于java - 如何在Java中使用大双数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20240275/
我正在尝试使用内联汇编进行试验,我正在尝试在内联汇编中添加十进制数(不,不是整数)。问题是,当我调用以下函数时: inline double ADD(double num1, double num2)
我有一个名为“a”的数据类型为 double 的数字,当这个数字小于 0.5 时,说b = 1 - a没有错误。但是当 a > 0.5 时,我说b = 1 - a代码中的该点存在错误(执行该特定行之前
我需要将双数添加到 ol 列表中。一个例子是: 欢迎访客1.1.介绍1.2.更多信息1.3.更多信息1.4.更多信息1.5.更多信息 另一个OL2.1.更多信息2.2.更多信息2.3.更多信息 我知道
我正在尝试将一些代码从 C++ 转换为 JavaScript,但我对 int、doubles、NaN 和解析 float 感到非常困惑。我想!? Z = T - 14 - (1); while (Z
我是一名优秀的程序员,十分优秀!