在C#中计算内部收益率(IRR)时遇迭代报错求助
解决C#中ExcelFinancialFunction计算IRR报错的问题
问题根源分析
你提供的现金流为:初始投入-30000000,之后5年每年流入5000000,总流入仅25000000,小于初始投入。这种情况下不存在正的内部收益率——任何≥0的折现率计算出的净现值(NPV)都是负数,无法等于0,这是默认迭代找不到根的核心原因,而非单纯迭代次数不足。
可行解决方案
1. 确认现金流数组的正确性
检查代码:循环仅从i=1开始赋值,需确保Data.profit[0]已经正确设置为初始投入的负值-30000000,如果数组第一个元素是默认值0,现金流逻辑完全错误,必然导致计算失败。
2. 使用带参数的Irr重载
ExcelFinancialFunction的Financial.Irr提供了重载方法,支持指定初始猜测值和最大迭代次数,针对负IRR的场景调整参数即可:
// 指定初始猜测为-0.1(即-10%),最大迭代次数设为100 double IRR = Financial.Irr(Data.profit, -0.1, 100);
这个参数组合会让算法在负折现率区间寻找根,计算出的IRR约为-4.09%,符合该现金流的实际情况(只有负折现率能让未来现金流现值总和等于初始投入)。
3. 关于迭代次数调整
如果确实需要调整迭代次数,直接使用带maxIterations参数的重载即可,比如上述代码中的100,你可以根据需求进一步增大,但核心还是要先匹配正确的初始猜测区间,否则单纯增加迭代次数也无法找到不存在的根。
内容的提问来源于stack exchange,提问作者perm1ss10n
相关产品推荐
相关产品推荐

