java - Apache POI 率公式长期不一致

标签 java apache-poi

为了模拟 Excel 的速率函数,我使用了 Apache POI我从 svn 中抓取的速率函数:

private double calculateRate(double nper, double pmt, double pv, double fv, double type, double guess) {

  //FROM MS http://office.microsoft.com/en-us/excel-help/rate-HP005209232.aspx
  int FINANCIAL_MAX_ITERATIONS = 20; //Bet accuracy with 128
  double FINANCIAL_PRECISION = 0.0000001; //1.0e-8

  double y, y0, y1, x0, x1 = 0, f = 0, i = 0;
  double rate = guess;
  if (Math.abs(rate) < FINANCIAL_PRECISION) {
     y = pv * (1 + nper * rate) + pmt * (1 + rate * type) * nper + fv;
  }
  else {
     f = Math.exp(nper * Math.log(1 + rate));
     y = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;
  }
  y0 = pv + pmt * nper + fv;
  y1 = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;

  // Find root by the Newton secant method
  i = x0 = 0.0;
  x1 = rate;
  while ((Math.abs(y0 - y1) > FINANCIAL_PRECISION) && (i < FINANCIAL_MAX_ITERATIONS)) {
     rate = (y1 * x0 - y0 * x1) / (y1 - y0);
     x0 = x1;
     x1 = rate;

     if (Math.abs(rate) < FINANCIAL_PRECISION) {
        y = pv * (1 + nper * rate) + pmt * (1 + rate * type) * nper + fv;
     }
     else {
        f = Math.exp(nper * Math.log(1 + rate));
        y = pv * f + pmt * (1 / rate + type) * (f - 1) + fv;
     }

     y0 = y1;
     y1 = y;
     ++i;
  }
  return rate;

对于calculateRate(120, 28.1, -2400, 0, 0, 0.1)),输出与Excel相同:0.599

但如果我尝试相同的计算,这次使用值:

calculateRate(360, 15.9, -2400, 0, 0, 0.1))

在 Excel 中,我得到 0.580,程序返回 -1.1500428517726355。有什么提示吗?

最佳答案

您在问题中粘贴的这段代码有很多问题。

它假设总是找到一个比率(不是真的)并且没有为找不到比率的情况做任何准备。

一些语句会抛出一个错误,这本可以通过使用更合适的编程语句来避免。例如,从您的代码中获取以下语句:

f = Math.exp(nper * Math.log(1 + rate));

这将在尝试查找负值或零值的 Log 时引发错误。它可以被重写为

f = Math.pow(1 + rate, nper);

迭代计算中的注释表明它正在对 secant method 进行编程,但检查迭代计算是否收敛了错误的变量。当它应该测试利率的收敛性时,它正在测试 future 值的收敛性。

我将您的代码复制粘贴到记事本中,删除了 Java 的变量声明,并将其替换为 JavaScript 变量声明,以使用您的示例数据测试代码。正如我所说,代码在第二次迭代时停止,因为 future 值的差异超出了误差范围,并且由于没有适当的测试来查看是否找到利率,代码按原样返回利率和一个这是错误的。

我不确定为什么这段代码在它确实报告了正确率的情况下起作用,就像第一个数据集的情况一样。我建议以正确的方式重新编码函数。

关于java - Apache POI 率公式长期不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14031208/

相关文章:

java - hadoop - 由所有映射方法为特定键生成的所有值都发送到一个单一的减少方法,这是正确的吗?

java - 计算字符串数组中出现的次数

java - 根据 Eclipse RCP 中选择的 View 激活上下文

java HttpServletResponse 文件大小超过 8k

java - 使用 apache poi 超链接到同一工作簿中的不同工作表

java app 开发报错 is not enclosing class

Java 按钮暂停图形更新

java - 如何处理excel文件java中的空白单元格

apache-poi - Apache POI宽度计算

java - 当单元格包含空值时从excel中获取数据