【问题标题】:Unexpected result from complex financial calculation复杂财务计算的意外结果
【发布时间】:2018-06-08 13:18:15
【问题描述】:

我正在使用 PHP 7.2。我正在将 Excel 电子表格转换为我们的财务分析应用程序。对于其中一个计算,我实际上是在复制单元格中的文本,将其粘贴到我的 PHP 应用程序中,然后用变量替换单元格引用。没有使用内置的 Excel 函数——它只是一个直接的公式。而且我并没有在物理上改变公式的结构——它是电子表格中内容的文字复制/粘贴。这是 Excel 中的公式:

=(A38*(1-(1+(G38/U38))^-N38)/(G38/U38))/((1+(G38/U38))^(((AB38-$I$5)/(365/U38))-1))

这是它在我的应用程序中的转换方式:

$x = ($payment_amount * (1 - (1 + ($discount_rate / 
     $payments_per_year))^-$payments_in_series) / 
     ($discount_rate / $payments_per_year)) / 
     ((1 + ($discount_rate / $payments_per_year))^((($days_between_dates) / 
     (365 / $payments_per_year)) - 1));

我的和 Excel 中的有一点不同,那就是(AB38-$I$5)。在 Excel 中,这会计算两个日期之间的天数。在 PHP 中,我使用 DateTime 来查找两个日期的天数差异,然后将其替换为 $days_between_dates。我已验证 PHP 与 Excel 计算的结果相匹配。

让我们假设这些值:

$payment_amount = 30000;
$discount_rate = .08;
$payments_in_series = 20;
$payments_per_year = 1;
$days_between_dates = 398;

在 Excel 中,我得到以下计算值:292502.06

在 PHP 中,我得到以下计算值:-7500000。当我使用var_dump 检查结果时,它会将其识别为float

我将此函数插入​​WolframAlpha 并从 Excel 中得到相同的结果。

我在Ideone 中尝试了同样的计算,得到了与 PHP 计算相同的结果。

我在哪里搞砸了?我完全没有想法,甚至不知道还有哪里可以排除故障。谢谢!

【问题讨论】:

  • 你应该使用pow而不是^

标签: php


【解决方案1】:

在 PHP 中,“^”不是求幂运算符,而是“按位异或”。 "**" 是等效的运算符。

还要确保 operator precedence 没有不同。

【讨论】:

  • 天哪。我什至没有注意到这一点。老实说,在我的职业生涯中,我从来没有用过幂运算符,所以我只是假设它是在 Excel 和一般数学中使用的。计时器用完后,我会将您的答案标记为正确。谢谢!
猜你喜欢
  • 2014-12-01
  • 1970-01-01
  • 2018-04-25
  • 2016-01-19
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多