2014-09-21 5 views
1

이것은 처음으로 BigDecimal을 사용하고 있으며, 몇 가지 문제가 있습니다. 여기 BigDecimal로 PI 계산하기

내 코드입니다 :

import java.math.BigDecimal; 

public class Test { 
    public static void main(String[] args) { 
     BigDecimal pi = new BigDecimal(4); 
     boolean plus = false; 
     for (int i = 3; i < 1000000; i += 2) { 
      if (plus) { 
       pi.add(new BigDecimal(4).divide(new BigDecimal(i), 2, BigDecimal.ROUND_HALF_UP)); 
      } else { 
       pi.subtract(new BigDecimal(4).divide(new BigDecimal(i), 2, BigDecimal.ROUND_HALF_UP)); 
      } 
      plus = !plus; 
     } 
     System.out.println(pi); 
    } 
} 

왜 그것을해야처럼 PI를 계산하지 않고 대신 저와 4의 답을 준다?

+0

이것은 매우 느리게 수렴하는 시리즈입니다. –

+0

천천히 수렴하기 때문에 결과에 오류가있는 것으로 나타날 수도 있습니다. http://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80 및 특히 "비정상적인 행동"섹션을 참조하십시오. – ajb

답변

3

pi는 절대로 변경하지 마십시오. BigDecimal를는 불변, 당신은 즉, 당신이 새 값에 할당 결코 당신을 변경하지 않을, 그래서 당신이/다른이를위한 좋은 장소가 될 것입니다 경우 내부 어딘가에

pi = ... 

이 있어야 것을 기억하십시오. BigDecimal API

변경이 불가능한, 임의 정밀도의 첫 번째 줄에서

if (plus) { 
    pi = pi.add(new BigDecimal(4).divide(new BigDecimal(i), 2, BigDecimal.ROUND_HALF_UP)); 
} else { 
    pi = pi.subtract(new BigDecimal(4).divide(new BigDecimal(i), 2, BigDecimal.ROUND_HALF_UP)); 
} 

소수점 번호를 체결했다.

또한 2의 눈금이 더 나은 것으로 변경 될 것입니다.

+0

감사합니다. 하지만 지금은 내 코드가 항상 3.16을 대답으로줍니다. –

+1

@ChristopherSmith : 끔찍한 스케일 값 2 –

+0

을 사용하고 있습니다. 좋습니다. Integer.MAX_VALUE-1을 사용하면 메모리 부족 예외가 발생합니다. 더 많은 메모리를 허용하는 것이 안전합니까? –

관련 문제