Почему я получаю NaN от этой функции XIRR?

Этот доводит меня до стены.

ОБНОВЛЕНИЕ: Собранный в jsfiddle, который выдает NaN: 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));

Функция зависит от моментов, что не вызывает проблем - console.log() внутри функции показывает, что даты анализируются правильно.

Этот фрагмент выше возвращает NaN, когда он должен вернуть -0,68. Если я запускаю те же самые значения через Excel:

Тестирование XIRR в Excel

Кто-нибудь может определить проблему? Это с функцией, я посылаю неправильные значения в?

2 ответа

@ Андреас дошел до сути. Эта функция 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().

Просто чтобы добавить к уже приведенным объяснениям, функция XIRR, используемая в этом описании, упоминает, что

Некоторые алгоритмы были портированы из Apache OpenOffice

Если вы установите одинаковые значения / даты в OpenOffice Calc, вы получите


Ища эту ошибку в отношении XIRR на форумах openoffice, вы попадаете на https://forum.openoffice.org/en/forum/viewtopic.php?t=14006 где они упоминают, что вероятная проблема - это то, что мы определили здесь.

Решение

Они предлагают решение, хотя (оказывается, это было решение конкретных ограничений),

Я предлагаю использовать SUM(C4:C15)/C3 (сумма внесенных значений минус полученное значение) в качестве предположения

В вашем случае это было бы SUM(B2:B4)/B1 и это действительно возвращает -0.684592

Другие вопросы по тегам