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


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

相关文章:

java - 我正在寻找一些帮助,以使用 Play 框架将 Polymer 与服务器端 Scala/java 一起使用

java - 与将 java.lang.Class<T> 类型的 Object 传递给方法相关的实际场景

java - Hadoop命令中FSIMAGE和EDIT文件的内容错误

Java BigDecimal 替代库

c++ - 什么是最好的(可移植)跨平台任意精度数学库?

java - 简单的短加法会产生警告

java - 为什么 XPath namespace-uri() 不能在 Java 中开箱即用?

java - 从 Java 中的 BigDecimal 中删除尾随零

java - 如何将字符串解析为 BigDecimal 而不会出错

java - 如何在Java中将整数转换为bigdecimal