[英]IRR in poi return NaN but correct value in excel
當我使用 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)
對我來說,它給出了#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 在Excel
。 但你的猜測是 0.1。 因此,使用該猜測內部apache poi
IRR
function 在 20 次嘗試后找不到准確度在 0.00001% 以內的結果。 所以#NUM。 返回錯誤值。
為什么apache poi
的IRR
function 與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);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.