我的代码:
//Ramanujan's Method of Calculating Pi
public class Main {
private static final double a1 = 9801.0;
private static final double a2 = 1103.0;
private static final double a3 = 26390.0;
private static final double a4 = 396.0;
private static final int loops = 2;
private static double asum;
public static double factorial(double n) {
if(n==0) return 1;
return n * factorial(n-1);
}
public static void main(String []args) {
//The calculation
for(int i=0;i<=loops;i++) {
asum += ((2*Math.sqrt(2))/a1)*((factorial(4.0*i))*(a2 + (a3 * i)))/(((Math.pow(factorial(i),4.0)))*(Math.pow(a4,(4.0 *i))));
}
System.out.println(Math.pow(asum,-1));
}
}
我很抱歉可读性差,但我现在正在打电话,因此很难编辑代码。我试图让我的程序使用ramanujans计算方法打印出Pi,但我只熟悉双打,并且在尝试使用Big Decimal后,我仍然卡住了。如何在此上下文中使用大小数?谢谢!
尝试:
import java.math.*;
//Ramanujan's Method of Calculating Pi
public class Main{
private static final BigDecimal a1 = new BigDecimal(9810);
private static final BigDecimal a2 = new BigDecimal(1103);
private static final BigDecimal a3 = new BigDecimal(26390.0);
private static final BigDecimal a4 = new BigDecimal(396.0);
private static final BigDecimal con1 = new BigDecimal(2*Math.sqrt(2));
private static final int loops = 2;
private static BigDecimal asum;
public static BigDecimal factorial(BigDecimal n){
if(n==n.ZERO) return n.ONE;
return n.multiply(factorial(n.subtract(n.ONE)));
}
public static BigDecimal calc1(int i){
BigDecimal ret = new BigDecimal((factorial(4*i));
return ret;
}
public static void main(String []args){
for(int i = 0;i <= loops;i++){
asum += (con1.divide(a1)).multiply(calc1(i)).multiply((a2 + (a3.multiply(i))).divide(((Math.pow(factorial(i),4.0))).multiply(Math.pow(a4,(4.0 *i))));
}
System.out.println(Math.pow(asum,-1));
}
}
答案 0 :(得分:0)
从double
转换为BigDecimal
s几乎是机械的。以下是通过几个简单步骤完成此操作的方法:
java.math.BigDecimal
导入double
类型的所有变量替换为BigDecimal
BigDecimal
构造函数的调用替换所有值初始化;将字段ZERO
和ONE
用于零和一。BigDecimal
方法重写表达式。您也可以添加常量以节省一些时间,例如
BigDecimal sqRootOfTwo = new BigDecimal(Math.sqrt(2));
最后一步是最棘手的一步:例如,如果你有一个看起来像这样的表达式
double d = a * b + c;
它必须像这样重写:
BigDecimal d = a.multiply(b).add(c);
分区也很棘手,因为您必须指定所需的精度。但是,整体转换应该相对简单:如果您设法使用double
让您的程序正常工作并且您正确地遵循转换,那么结果应该可以正常工作。