当前位置: 首页 > 知识库问答 >
问题:

poi中的IRR返回NaN,但excel中的值正确

麹高义
2023-03-14

当我使用apache/poi计算Irr值时,我得到了两倍。NaN,但在excel中同样的输入,我得到了一个负值。

那么为什么它们返回不同的价值呢?

inputs here:

irr(-1.0601017230994111E8,19150.63,44505.08,22997.34,33936.39,27265.92,2127.66,2108.63,886.53,2482.27,4305.12,3421.58,65644.12,1020.51,2659.57,3191.49,20284508.4,1881279.27,11675415.09,7557862.28,921090.46,622104.32,289267.36,183.41,886.53, 0.1)

共有1个答案

禄俊逸
2023-03-14

对我来说,它给出了#NUM!当前apache poi 4.1.0中出现错误,不是NaN

问题在于你的猜测。内部收益率函数中规定:

猜是可选的。你猜的这个数字接近内部收益率的结果。

Microsoft Excel使用迭代技术计算内部收益率。从guess开始,IRR循环计算,直到结果精确到0.00001%以内。如果IRR在20次尝试后找不到有效的结果,那么#NUM!返回错误值。

在大多数情况下,你不需要为内部收益率的计算提供猜测。如果省略猜测,则假定为0.1(10%)。

如果IRR给出#NUM!错误值,或者如果结果与预期不符,请使用不同的“猜测”值重试。

您的IRR结果将是Excel中的-0.050193141。但你的猜测是0.1。因此,使用该猜测,内部的apache poiIRR函数在20次尝试后,找不到准确度在0.00001%以内的结果。所以#NUM!返回错误值。

为什么apache poi的IRR函数与Excel中的IRR函数不同?因为Excel的那部分不是开源的。所以没有人真正知道它是如何工作的。

使用-0.1的猜测对我有用。

例子:

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

class ExcelEvaluateIRR {

 public static void main(String[] args) throws Exception {

  try (Workbook workbook = new XSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {

   Double[] values = new Double[] {
    -1.0601017230994111E8,
    19150.63,
    44505.08,
    22997.34,
    33936.39,
    27265.92,
    2127.66,
    2108.63,
    886.53,
    2482.27,
    4305.12,
    3421.58,
    65644.12,
    1020.51,
    2659.57,
    3191.49,
    20284508.4,
    1881279.27,
    11675415.09,
    7557862.28,
    921090.46,
    622104.32,
    289267.36,
    183.41,
    886.53
   };

   Sheet sheet = workbook.createSheet();
   Row row = null;
   Cell cell = null;
   for (int r = 0; r < values.length; r++) {
    row = sheet.createRow(r);
    cell = row.createCell(0);
    cell.setCellValue(values[r]);
   }
   row = sheet.createRow(values.length);
   cell = row.createCell(0);
   //cell.setCellFormula("IRR(A1:A" + values.length + ",0.1)"); // will not work
   cell.setCellFormula("IRR(A1:A" + values.length + ",-0.1)"); // will work
   FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
   CellValue cellValue = formulaEvaluator.evaluate(cell);
   System.out.println(cellValue);

   workbook.write(fileout);
  }

 }
}
 类似资料:
  • 所以我试着接受单元格值,比如“150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SYMBOL150SY

  • 我在一个JavaScript类中有一个乘法方法,它应该将数组中非未定义的所有元素相乘。我使用for loop检查每个元素的类型,即number并将它们推到一个空数组,然后使用reduce方法将它们相乘。但我现在有的问题是结果是返回南。我想知道我做错了什么。 下面是我的代码。 null null

  • 我很熟悉在JavaScript中是“怪异的”,即总是返回,如本文所述。因此,不应进行比较来检查,而应使用isNaN(..)取而代之的是。 所以我惊讶地发现 这似乎不一致。为什么会有这种行为? 它是怎么工作的?方法是否专门检查?

  • 我正在尝试单元测试我的类,它看起来像:- 我想在类B中模拟“method2()”。我知道我们需要有一个B()的mock对象,这样每当我们调用它的方法时,就会发生模拟。这是我试过的 并使用调用它,现在的主要问题是method2被嘲弄了(即method2()的主体没有被执行),但我无法接收C的对象作为响应。 我的测试场景是:- 我想测试类A的method1(),它反过来调用类B的method2(),但

  • 问题内容: def size_of_dir(dirname): print(“Size of directory: “) print(os.path.getsize(dirname)) 是有问题的代码。dirname是一个目录,其中包含 130个 文件,每个文件约 1kb 。当我调用此函数时,它返回 4624 ,这 不是 目录的大小…为什么? 问题答案: 此值(4624B)代表的大小 文件 是 描

  • 问题内容: 我有2个DropDownList,例如Master-Slave。这是我的Default.aspx: 这是我的脚本: 和我的处理程序: 但没有要追加的内容。另外,我在firebug窗口中看到如下响应(当我从Master ddl中选择G2时): 对于更具体的视图,下图是当我在Master ddl中选择G3时,firebug窗口中的JSON选项卡: 我用这个新的脚本来更改脚本的成功方法: 当