2014-10-27 50 views
-2

我的代码:如何在这种情况下使用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)); 
} 

}

+0

我尝试使用我的变量asum作为一个大的小数,然后用大十进制的默认函数替换所有的操作 – BlurryZombie 2014-10-27 19:04:38

+1

您可以发布该代码吗? – Mshnik 2014-10-27 19:05:10

+0

我假设当你试图替换BigDecimal时,你遇到了问题。他们是什么? (是的,按照Mshnik的建议发布代码。) – 2014-10-27 19:08:33

回答

0

double从及其转换至BigDecimal s是几乎机械。这里是你如何能做到在几个简单的步骤:

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

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

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

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

double d = a * b + c; 
表达

它将不得不像这样重写:

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

分部也很棘手,因为您必须指定所需的精度。但是,整体转换应该相对简单:如果您设法使用double s来使程序正常工作,并且正确执行转换,则结果应该可以正常工作。

+0

中的内存和数据/对象类型的问题。好的,谢谢你的详细说明!我现在试试看:-) – BlurryZombie 2014-10-27 19:10:19