搜索

首页  >  问答  >  正文

如何在 PHP 中复制 Excel FV 函数?

我正在将一些相当复杂的计算从 Excel 电子表格转换为 PHP。我被困在 Excel 的 FV 函数的转换上,它是这样定义的:

FV( interest_rate, number_payments, payment, PV, Type )

我已经为此工作了 2 个小时,我肯定遗漏了一些东西。本质上,我需要将此功能复制到等效的 PHP 函数中,并采用上述所有参数。

任何帮助将非常感激。

P粉106301763P粉106301763387 天前845

全部回复(1)我来回复

  • P粉621033928

    P粉6210339282023-11-05 00:04:08

    对 PHPExcel 函数库稍作修改:

    /**
     * FV
     *
     * Returns the Future Value of a cash flow with constant payments and interest rate (annuities).
     *
     * @param   float   $rate   Interest rate per period
     * @param   int     $nper   Number of periods
     * @param   float   $pmt    Periodic payment (annuity)
     * @param   float   $pv     Present Value
     * @param   int     $type   Payment type: 0 = at the end of each period, 1 = at the beginning of each period
     * @return  float
     */
    function FV($rate = 0, $nper = 0, $pmt = 0, $pv = 0, $type = 0) {
    
        // Validate parameters
        if ($type != 0 && $type != 1) {
            return False;
        }
    
        // Calculate
        if ($rate != 0.0) {
            return -$pv * pow(1 + $rate, $nper) - $pmt * (1 + $rate * $type) * (pow(1 + $rate, $nper) - 1) / $rate;
        } else {
            return -$pv - $pmt * $nper;
        }
    }   //  function FV()
    
    
    echo FV(0.0149562574418, 4, 43.875, -250);

    返回 85.818510876629

    // 单元测试

    class ExcelTest extends \PHPUnit_Framework_TestCase
    {
    
        public function test_it_calculates_fv_value()
        {
            $test_data = [
                [ 0.005,          10, -200,  -500,    1,    2581.4033740601 ],
                [ 0.01,           12, -1000, null,    null, 12682.503013197 ],
                [ 0.009166666667, 35, -2000, null,    1,    82846.246372418 ],
                [ 0.005,          12, -100,  -1000,   1,    2301.4018303409 ],
                [ 0.004166666667, 60, -1000, null,    null, 68006.082841536 ],
                [ 0.025,          16, -2000, 0,       1,    39729.460894166 ],
                [ 0.0,            12, -100,  -100,    null, 1300            ]
            ];
    
            $test_case_id = 0;
            foreach($test_data as $test_case) {
                $test_case_id++;
                list($rate, $nper, $pmt, $pv, $type, $expected_result) = $test_case;
                $this->assertEquals($expected_result, Excel::FV($rate, $nper, $pmt, $pv, $type), "Test case $test_case_id failed", 0.0000001);
            }
        }
    
    }

    回复
    0
  • 取消回复