如何在这种情况下使用Java N#39; Bigdecimal?

时间:2014-10-27 18:59:15

标签: java

我的代码:

//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));
}

}

1 个答案:

答案 0 :(得分:0)

double转换为BigDecimal s几乎是机械的。以下是通过几个简单步骤完成此操作的方法:

  • 在程序顶部添加java.math.BigDecimal导入
  • double类型的所有变量替换为BigDecimal
  • 类型的变量
  • 使用BigDecimal构造函数的调用替换所有值初始化;将字段ZEROONE用于零和一。
  • 使用BigDecimal方法重写表达式。

您也可以添加常量以节省一些时间,例如

BigDecimal sqRootOfTwo = new BigDecimal(Math.sqrt(2));

最后一步是最棘手的一步:例如,如果你有一个看起来像这样的表达式

double d = a * b + c;

它必须像这样重写:

BigDecimal d = a.multiply(b).add(c);

分区也很棘手,因为您必须指定所需的精度。但是,整体转换应该相对简单:如果您设法使用double让您的程序正常工作并且您正确地遵循转换,那么结果应该可以正常工作。