0

当我使用 apache/poi 计算 Irr 值时,我得到 Double.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)

4

1 回答 1

2

对我来说,它给出了#NUM!电流错误apache poi 4.1.0,不是NaN

问题在于你给定的猜测。在IRR 函数中指出:

猜测 可选。您猜测的数字接近 IRR 的结果。

Microsoft Excel 使用迭代技术来计算 IRR。从猜测开始,IRR 循环计算,直到结果准确在 0.00001% 以内。如果 IRR 在 20 次尝试后找不到有效的结果,#NUM!返回错误值。

在大多数情况下,您不需要为 IRR 计算提供猜测。如果省略guess,则假定为0.1(10%)。

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

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

为什么apache poiIRR功能 与 中 的 不 一样Excel? 好吧,因为那部分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);
  }

 }
}
于 2019-10-11T08:00:28.487 回答