You are here

public static function PHPExcel_Calculation_Financial::RATE in Loft Data Grids 6.2

Same name and namespace in other branches
  1. 7.2 vendor/phpoffice/phpexcel/Classes/PHPExcel/Calculation/Financial.php \PHPExcel_Calculation_Financial::RATE()

* RATE * * Returns the interest rate per period of an annuity. * RATE is calculated by iteration and can have zero or more solutions. * If the successive results of RATE do not converge to within 0.0000001 after 20 iterations, * RATE returns the #NUM! error value. * * Excel Function: * RATE(nper,pmt,pv[,fv[,type[,guess]]]) * * @access public * @category Financial Functions *

Parameters

float nper The total number of payment periods in an annuity.: * @param float pmt The payment made each period and cannot change over the life * of the annuity. * Typically, pmt includes principal and interest but no other * fees or taxes. * @param float pv The present value - the total amount that a series of future * payments is worth now. * @param float fv The future value, or a cash balance you want to attain after * the last payment is made. If fv is omitted, it is assumed * to be 0 (the future value of a loan, for example, is 0). * @param integer type A number 0 or 1 and indicates when payments are due: * 0 or omitted At the end of the period. * 1 At the beginning of the period. * @param float guess Your guess for what the rate will be. * If you omit guess, it is assumed to be 10 percent. * @return float *

File

vendor/phpoffice/phpexcel/Classes/PHPExcel/Calculation/Financial.php, line 1832

Class

PHPExcel_Calculation_Financial
PHPExcel_Calculation_Financial

Code

public static function RATE($nper, $pmt, $pv, $fv = 0.0, $type = 0, $guess = 0.1) {
  $nper = (int) PHPExcel_Calculation_Functions::flattenSingleValue($nper);
  $pmt = PHPExcel_Calculation_Functions::flattenSingleValue($pmt);
  $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv);
  $fv = is_null($fv) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($fv);
  $type = is_null($type) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($type);
  $guess = is_null($guess) ? 0.1 : PHPExcel_Calculation_Functions::flattenSingleValue($guess);
  $rate = $guess;
  if (abs($rate) < FINANCIAL_PRECISION) {
    $y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv;
  }
  else {
    $f = exp($nper * log(1 + $rate));
    $y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv;
  }
  $y0 = $pv + $pmt * $nper + $fv;
  $y1 = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv;

  // find root by secant method
  $i = $x0 = 0.0;
  $x1 = $rate;
  while (abs($y0 - $y1) > FINANCIAL_PRECISION && $i < FINANCIAL_MAX_ITERATIONS) {
    $rate = ($y1 * $x0 - $y0 * $x1) / ($y1 - $y0);
    $x0 = $x1;
    $x1 = $rate;
    if ($nper * abs($pmt) > $pv - $fv) {
      $x1 = abs($x1);
    }
    if (abs($rate) < FINANCIAL_PRECISION) {
      $y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv;
    }
    else {
      $f = exp($nper * log(1 + $rate));
      $y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv;
    }
    $y0 = $y1;
    $y1 = $y;
    ++$i;
  }
  return $rate;
}