java - 使用 BigDecimal 的乘法不准确

标签 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]);

我遇到的问题是,当我将 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/

相关文章:

java - 搜索具有特定名称的项目列表

java - Log4j - 使用 DatePattern 后文件扩展名 (.log) 消失

java - 为什么 Java 构造函数不能同步?

java - 使用 BigDecimal 计算欧拉数

groovy - 在 groovy/grails 中的 BigDecimal 上使用比较运算符是否安全?

java - 根据 BigDecimals 的有效数字比较 BigDecimals 是否接近可接受

java - JPA 和 JSON 运算符 native 查询

java - 正确使用 Guava 两种类型的谓词

java - 如何将 DecimalFormat 的小数点分隔符从逗号更改为点/点?

java - Big Decimal 总是四舍五入到两位小数(即使我的 BigDecimal 对象没有小数)?