我是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值不同的值.任何帮助表示赞赏.
BigDecimal是正确的.Excel不正确.
BigDecimal旨在提供精确的精度.因此,导致重复小数的操作会引发异常,因为无法进行精确表示:
BigDecimal.ONE.divide(new BigDecimal(3));
Run Code Online (Sandbox Code Playgroud)
导致ArithmeticException消息:
非终止十进制扩展; 没有确切的可表示的小数结果
Excel使用浮点运算,这是不精确的,或者更确切地说具有最高精度.有了它,小的分数误差可能累积,可能导致数学上"不正确"的答案.