0

这个把我逼到了墙角。

更新:组装在产生 NaN 的 jsfiddle 中:https ://jsfiddle.net/eqcww2y7/6/

我正在使用这个 XIRR 函数:https ://gist.github.com/ghalimi/4669712

在该函数中,我发送了一对简单的数组 - 4 个日期,4 个现金流值。

var dates = [
  "2016-01-01",
  "2016-02-01",
  "2016-03-01",
  "2016-04-01",
];

var values = [
  -1000000,
  0,
  0,
  750000
];

console.log('dates', dates);
console.log('values', values);
console.log(XIRR(values, dates, 0.1));

该函数依赖于 momentjs,这不会导致任何问题 -console.log()函数内部显示日期被正确解析。

上面的那个片段返回 NaN,它应该返回 -0.68。如果我通过 Excel 运行这些完全相同的值:

在 Excel 中测试 XIRR

谁能发现这个问题?是否与功能有关,我是否发送了错误的值?

4

2 回答 2

0

只是为了补充已经给出的解释,该要点中使用的 XIRR 函数提到

一些算法已经从 Apache OpenOffice 移植过来

如果您在 OpenOffice Calc 中设置相同的值/日期,您会得到

在此处输入图像描述


在 openoffice 论坛中搜索与 XIRR 相关的此错误,您可以访问https://forum.openoffice.org/en/forum/viewtopic.php?t=14006,他们提到可能的问题是我们在此处发现的问题。

解决方案

他们确实提供了解决方案(事实证明这是针对特定约束的解决方案),

我建议您使用 SUM(C4:C15)/C3 (存款值的总和减去收到的值)作为猜测

在你的情况下,SUM(B2:B4)/B1它确实返回-0.684592

于 2016-12-02T13:11:11.877 回答
0

@Andreas 抓住了它的核心。这个 XIRR 函数是在 2012 年编写的,从 ECMAScript 2015 开始,Math.pow() 的行为有所不同。我不确定这是否是适用于所有浏览器/引擎/实现的问题,但对于我的特定用例,XIRR() 返回 NaN,因为基数和指数输入为负数。

更新:为了澄清 - 在我的用例中,基数/指数对开始如下:

x = 1.1, y = 0.0849
x = 1.1, y = 1.2493

但是一次迭代后我有这个:

x = -0.512, y = 0.084
x = -0.512, y = 1.164 

由于 x 是一个负的非整数,我总是会得到 NaN,不管指数是什么。至少这是我对 Math.pow() 局限性的理解。

于 2016-12-02T12:48:33.217 回答