Bo.*_*hai 2 excel-formula apache-poi irr
当我使用 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)
Run Code Online (Sandbox Code Playgroud)
对我来说它给出了#NUM!当前的错误apache poi 4.1.0,不是NaN。
问题在于你给出的猜测。IRR 函数中指出:
猜猜 可选。您猜测的数字接近 IRR 的结果。
Microsoft Excel 使用迭代技术来计算 IRR。从猜测开始,IRR 循环进行计算,直到结果精确到 0.00001% 以内。如果 IRR 在 20 次尝试后找不到有效的结果,则 #NUM! 返回错误值。
在大多数情况下,您不需要为 IRR 计算提供猜测。如果省略猜测,则假定为 0.1(10%)。
如果 IRR 给出#NUM!错误值,或者如果结果与您的预期不接近,请使用不同的猜测值重试。
你的结果IRR将是 -0.050193141 Excel。但你的猜测是0.1。因此,使用该猜测,内部apache poi IRR函数在 20 次尝试后找不到准确度在 0.00001% 以内的结果。所以#NUM!返回错误值。
为什么apache poi功能IRR与中不一样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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1133 次 |
| 最近记录: |