2014-10-27 53 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