Как я могу повторить функцию Excel FV в PHP? - PullRequest
3 голосов
/ 23 июля 2010

Я конвертирую некоторые довольно сложные вычисления из таблицы Excel в PHP.Я застрял в преобразовании функции FV в Excel, которая определяется следующим образом:

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

Я работаю над этим уже 2 часа, и должно быть что-то, чего мне не хватает.По сути, мне нужно скопировать эту функциональность в эквивалентную функцию PHP, принимая все вышеупомянутые аргументы.

Любая помощь будет очень оценена.

Ответы [ 4 ]

7 голосов
/ 23 июля 2010

Слегка изменено из библиотеки функций 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);
        }
    }

}
4 голосов
/ 23 июля 2010
function fv($r,$n,$p,$pv=0)
{
   $sum = $pv;
   for ( $i=0;$i<$n;$i++ )
   {
       $sum += $sum*$r + $p;
   }
   return $sum;
}

echo fv(0.1,4,10,100);

Расширение параметра Type оставлено для чтения читателю.

0 голосов
/ 25 ноября 2014

У меня была та же проблема, и я обнаружил, что это действительно хорошая функция. Эти два выше не работали для моих нужд ...

$ R за ставку, $ n число периода, $ pmt - выплаченная сумма

функция PV ($ R, $ n, $ pmt, $ m = 1) {

$ Z = 1 / (1 + ($ R / $ m));

return ($ pmt * $ Z * (1 - pow ($ Z, $ n))) / (1 - $ Z);

}

echo PV(0,00333333, 180, 1221);

Не забудьте, например, если вы хотите узнать, сколько вы получите через 15 лет, если вы платите 1221 евро в месяц с годовой ставкой 4%, вам придется поделить на 12 ставку и поставить 180 месяцев.

0 голосов
/ 27 февраля 2014

Я столкнулся с подобной проблемой и получил помощь от кого-то на этом посте, я надеюсь, что кто-то еще посчитает это полезным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...