Vendor/phpspreadsheet/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Financial.php
public static function RATE($nper, $pmt, $pv, $fv = 0.0, $type = 0, $guess = 0.1)
    {
        $nper = (int) Functions::flattenSingleValue($nper);
        $pmt = Functions::flattenSingleValue($pmt);
        $pv = Functions::flattenSingleValue($pv);
        $fv = ($fv === null) ? 0.0 : Functions::flattenSingleValue($fv);
        $type = ($type === null) ? 0 : (int) Functions::flattenSingleValue($type);
        $guess = ($guess === null) ? 0.1 : Functions::flattenSingleValue($guess);

        $rate = $guess;
        if (abs($rate) < self::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) > self::FINANCIAL_PRECISION) && ($i < self::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) < self::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;
    }
public static function RATE($nper, $pmt, $pv, $fv = 0.0, $type = 0, $guess = 0.1)
    {
        $nper = (int) Functions::flattenSingleValue($nper);
        $pmt = Functions::flattenSingleValue($pmt);
        $pv = Functions::flattenSingleValue($pv);
        $fv = ($fv === null) ? 0.0 : Functions::flattenSingleValue($fv);
        $type = ($type === null) ? 0 : (int) Functions::flattenSingleValue($type);
        $guess = ($guess === null) ? 0.1 : Functions::flattenSingleValue($guess);

        $rate = $guess;
        if (abs($rate) < self::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) > self::FINANCIAL_PRECISION) && ($i < self::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) < self::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;
    }
public static function RATE ( $ nper , $ pmt , $ pv , $ fv = 0.0 , $ type = 0 , $ guess = 0.1 ) { $ nper = ( int ) Functions :: flattenSingleValue ( $ nper ) ; $ pmt = Functions :: flattenSingleValue ( $ pmt ) ; $ pv = Functions :: flattenSingleValue ( $ pv ) ; $ fv = ( $ fv === null ) ? 0.0 : Functions :: flattenSingleValue ( $ fv ) ; $ type = ( $ type === null ) ? 0 : ( int ) Functions :: flattenSingleValue ( $ type ) ; $ guess = ( $ guess === null ) ? 0.1 : Functions :: flattenSingleValue ( $ guess ) ; $ rate = $ guess ; if ( abs ( $ rate ) < self :: 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 ) > self :: FINANCIAL_PRECISION ) && ( $ i < self :: 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 ) < self :: 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 ; }
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]]])

@category Financial Functions

@param 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 int $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
RATE .