我是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]);
我遇到的问题是,当我将i = 1,...,52的stockPrice [1] [i]的值复制到excel中并计算乘积时,我得到的代码与BigDecimal值不同。任何帮助表示赞赏。
最佳答案
BigDecimal是正确的。 Excel不正确。
BigDecimal旨在提供精确的精度。如此之多,会导致重复小数的操作会引发异常,因为不可能进行精确的表示:
BigDecimal.ONE.divide(new BigDecimal(3));
导致出现
ArithmeticException
消息:无终止的十进制扩展;没有确切可表示的十进制结果
Excel使用floating point arithmetic,这是不精确的,或者具有最高的精确度。有了它,小的分数误差可能会累积,从而导致数学上的“错误”答案。
关于java - 使用BigDecimal的不正确乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22665656/