вычисление будущего значения не возвращает ожидаемый результат

#php #excel #function #financial

#php #excel #функция #финансовые

Вопрос:

есть следующая функция FV

 private static function fv($r,$n,$p,$pv=0)
{
    $sum = $pv;
    for ( $i=0;$i<$n;$i   ) {
     $sum  = ($sum * $r)   $p;
    }
    return $sum;
}
  

Это значения, которые я передаю:

0.0067
444
1834.58

Это значение, которое я ожидаю от моего deskcheck: 4983453.613 Это то, что я получаю от моего метода: 5036155.12

Сводит меня с ума. Я перепробовал кучу других функций в режиме онлайн; ни одна из них не работает!

Комментарии:

1. Что именно вы пытаетесь получить?

2. @Mob: будущая стоимость пенсионного фонда…

3. Я предполагаю, что r = процентная ставка, n = количество периодов и pv = текущая стоимость, но что такое p?

4. может ли быть так, что каждый раз, когда вы умножаете и добавляете его к сумме, вы получаете ошибку округления, потому что, когда вы делаете это на калькуляторе, оно округляется не так сильно? возможно, вам следует повторять сумму каждый раз, когда она повторяется, и посмотреть, есть ли ошибка округления.

5. @jprofitt p = текущее месячное значение

Ответ №1:

Это ошибка округления, но только в той мере, 0.0067 в какой она недостаточно точна.

Потому $r = 0.0067 что я получаю тот же результат, что и ваш.

Потому $r = 0.00666666666666666666666 что я получаю результат, который вы хотите.

Я предлагаю вам пройти $r = 1 / 150 для максимально возможной точности.

Комментарии:

1. вы правы. это ошибка округления. Просто протестировал его прямо сейчас, и я получаю правильное значение. Большое спасибо.

Ответ №2:

Я просто прогнал это через электронную таблицу Excel (установите ячейку A1 в 0, установите ячейку A2 в =A1 (A1*0.0067) 1834.58 , скопируйте до A445 (что представляет 444 итерации, начиная с 0). Последняя итерация выдает 5036155.12, как вы говорите, ваша функция.

Как вы вычисляете 4983453.613, который, по вашим словам, вы ожидаете? Вы дважды проверили свой метод там? Я не понимаю этого ни на одном этапе.

Первые три итерации выглядят как:

 1834.58
3681.451686
5540.697412
  

и последние три как:

 4965710.242
5000815.08
5036155.122
  

Ответ №3:

 private static function fv($r=0,$n=0,$pv=0)
{

    for ( $i=0;$i<$n;$i   ) {
        $pv =($pv*$r);
    }
    return $pv;
}

echo fv(0.0067,444,1834.58);
  

Небольшая уборка, и вышесказанное должно сработать.. $ p не был установлен в любое время, из-за вашей области видимости вы можете переназначить $ pv внутри функции без необходимости определять $sum.