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