2014-03-26 2 views
1

저는 Java에서 약간의 초보자입니다. 52 개의 주식 가격을 생성하는 프로그램이 있습니다.이 프로그램은 0에서 약 2000의 범위를 가질 수 있습니다. 또한 내 프로그램은 N 개의 다른 주가 "경로" . 나는이 52 주가의 제품이 무엇인지 알아 내고 싶다. 나는 BigDecimal을 사용하기로 결정했다.BigDecimal을 사용한 부정확 한 곱셈

BigDecimal[] productOfStock1 = new BigDecimal[N+1]; 
    for(int k = 1; k <= N; k++){ 
     productOfStock1[k] = BigDecimal.ONE; 
    } 

for(int k = 1; k <= N; k++){ 

    for(int i = 1; i <= n; i++){ 
     if (i == 1){ 
     stockPrice[k][i] = stockZero*Math.pow(e, form + sigma*(randomno.nextGaussian())); 
     } 
     else { 
     stockPrice[k][i] = stockPrice[k][i-1]*Math.pow(e, form + sigma*(randomno.nextGaussian())); 

     } 

     productOfStock1[k] = productOfStock1[k].multiply(BigDecimal.valueOf(stockPrice[k][i])); 

     System.out.println("Stock at [" + i + "] for N = " + N + " and path number " + k + " is " + stockPrice[k][i]); 


    } 
    System.out.println("Product : " + productOfStock1[k]); 

내가 stockPrice 값을 복사 할 때 [1] [I]를 I에 대해 = 1, ..., Excel로 (52) 및 제품을 산출은, I는 다른 값을 얻을 수 있다고 하였다 부딪힌 문제 내 코드의 BigDecimal 값에서. 어떤 도움을 주셔서 감사합니다.

+1

실제로 어느 것이 옳은지 알아 냈습니까? 아니면 더 정확하게? Excel 또는 BigDec? – Fildor

+0

나는 실제로 어떻게 체크해야할지 모르지만 처음 10 개의 숫자를 계산하고 Excel의 제품 기능과 비교해 보았는데 거의 같았습니다. Excel이 정확하다고 가정합니다. – user3251256

답변

5

BigDecimal이 정확합니다. Excel이 올바르지 않습니다.

BigDecimal은 정확한 정밀도를 제공하도록 설계되었습니다. 순환 소수 초래 작업, 예외를 throw 너무 많이 있으므로, 정확한 표현은 할 수 없기 때문에 :

BigDecimal.ONE.divide(new BigDecimal(3)); 

메시지와 함께 ArithmeticException 원인 :

비 종료 진수 확장; 더 정확한 표현 가능한 소수 결과

엑셀 부정확, 또는 오히려 정밀의 최대 레벨을 가지고있는 floating point arithmetic을 사용하지 않습니다. 그것으로 작은 분수 오류가 잠재적으로 누적되어 수학적으로 "잘못된"답을 얻을 수 있습니다.