使用BigDecimal进行不准确的乘法运算

use*_*256 1 java bigdecimal

我是Java的新手,我有一个程序可以生成52种不同的股票价格,范围从0到大约2000.我的程序还生成N个不同的股票价格"路径".我想知道这52种股票价格的产品是什么.我决定使用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]);
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是当我将stockPrice [1] [i]的值i = 1,...,52复制到excel并计算产品时,我从我的代码中得到一个与BigDecimal值不同的值.任何帮助表示赞赏.

Boh*_*ian 5

BigDecimal是正确的.Excel不正确.

BigDecimal旨在提供精确的精度.因此,导致重复小数的操作会引发异常,因为无法进行精确表示:

BigDecimal.ONE.divide(new BigDecimal(3));
Run Code Online (Sandbox Code Playgroud)

导致ArithmeticException消息:

非终止十进制扩展; 没有确切的可表示的小数结果

Excel使用浮点运算,这是不精确的,或者更确切地说具有最高精度.有了它,小的分数误差可能累积,可能导致数学上"不正确"的答案.