复杂财务计算的意外结果

时间:2018-06-08 13:18:15

标签: php

我正在使用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计算相同的结果。

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

1 个答案:

答案 0 :(得分:1)

在PHP中,“^”不是取幂运算符,而是“按位Xor”。 “**”是等效的运算符。

同时确保operator precedence没有区别。