2014-03-26 44 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]); 

我跑進是,[1]對i,當我複製stockPrice的值[I] = 1,...,52導入Excel和計算產品,得到了一個不同的值的問題來自我的代碼的BigDecimal值。任何幫助表示讚賞。

+1

你發現哪一個實際上是正確的嗎?還是更精確? Excel或BigDec? – Fildor

+0

我真的不知道如何檢查,但我手算了前10個數字,並與Excel的產品功能進行了比較,他們大致相同。我假設Excel是準確的。 – user3251256

回答

5

BigDecimal是正確的。 Excel不正確。

BigDecimal旨在提供準確的精度。正因如此,這將導致循環小數操作拋出一個異常,因爲一個精確的表示是不可能的:

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

導致的ArithmeticException與消息:

非十進制擴展;沒有確切表示的小數結果

Excel使用floating point arithmetic,這是不精確的,或者更確切地說,具有精度最大水平。有了它,小的分數錯誤可能會累積,從而導致數學上的「錯誤」答案。