2014-02-23 2 views
1

이 코드가 있습니다. 문제는 다음과 같습니다. numar는 필요에 따라 계산하지만 변경되지 않은 pi에 추가하지 못합니다. 왜?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"그래서 네 번째 문자를 얻을 수 없습니다 ... – Reimeus

답변

6

add 값을 변경할 수없는 BigDecimal 값을 반환합니다. 원래 값이 다른 pi의 값이 원래 값으로 유지하는 메소드의 결과에 할당 할 필요가

pi = pi.add(numar); 
+0

잊지 쉽게하고 또한 워드 프로세서에서 간과하기 쉽습니다. BigDecimal의 일반 사용자와 기본적으로 불변의 팬이라는 사실에도 불구하고 지금까지 여러 번이 코드로 복잡한 코드를 작성했습니다. –

4

당신은 추가 한 후 자체에 변수 '파이'의 값을 할당해야합니다 파이 = pi.add (numar);

공공의 BigDecimal가

는 값이다 (이 피가수 +)로 스케일 최대 BigDecimal를 돌려 (피가수의 BigDecimal)를 추가 (이 this.scale()을 augend.scale()).