Почему я получаю 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:
Кто-нибудь может определить проблему? Это с функцией, я посылаю неправильные значения в?
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