2014-02-23 114 views
1

有這個代碼。問題是以下幾點:numar計算它應該,但未能添加到pi,它仍然是0.0,保持不變。爲什麼?BigDecimal添加問題

public static void piLeibniz(int numarZecimale) 
{ 
    String piReal = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679"; 
    long t1 = System.currentTimeMillis(); 

    BigDecimal numar ; 
    BigDecimal pi = new BigDecimal("0.0"); 

    for(int i = 0; i<=100000000;i++) 
    { 
     numar = new BigDecimal(4*((Math.pow(-1, i))/((2*i)+1))); 
     pi = pi.add(numar); 
     //System.out.println(numar); 
     String piString = pi.toString(); 
     System.out.println(piString); 

     if(!piString.substring(0, numarZecimale).equals(piReal.substring(0, numarZecimale))) 
     { 
     } else { 
      long t2 = System.currentTimeMillis(); 
      System.out.println("Pi este:" + piReal.substring(0, numarZecimale)+ " calculat in " + (t2-t1) + " ms"); 
      break; 
     } 

    } 
} 

EDIT(編輯爲Reimeus說): 如果該方法的參數是高於3,它拋出的StringIndexOutOfBoundsException。爲什麼?

+1

對於第二部分來說,你的字符串是「4.0」,所以你不能得到第4個字符...... – Reimeus

回答

6

add返回一個不可變的新值BigDecimal。原始值需要被分配給該方法的結果,否則的pi值將保持在其原始值

pi = pi.add(numar); 
+0

這麼容易被遺忘,而且在文檔中也很容易忽略。儘管他們都是BigDecimal的普通用戶,並且默認情況下是不可變性的忠實粉絲,但我現在已經在複雜代碼中多次出現了這種情況! –

4

需要添加後重新分配變量「P1」到其自身的值: PI = pi.add(NUMAR);

公共BigDecimal的添加(BigDecimal的被加數)

返回BigDecimal,其值爲(this +被加數),其標是爲max(this.scale(),augend.scale())。