如何在PHP中正确使用Excel Rate函数?

如何在PHP中正确使用Excel Rate函数?,php,Php,上次我发这个问题的时候,我被你们打了屁股,因为我不清楚我在问什么…我搞砸了,对不起。让我再试一次 我试图在PHP中模拟Excel Rate函数。我确实获得了一些代码,这些代码对于其他Excel函数来说运行正常,但对于Rate函数来说却不稳定 涉及两个步骤: 1。计算付款 PMT($rate/12, $nper*12, $pv, $fv, $type) $rate = .08 // interest rate $nper = 30 // loan term in years $pv = (1000

上次我发这个问题的时候,我被你们打了屁股,因为我不清楚我在问什么…我搞砸了,对不起。让我再试一次

我试图在PHP中模拟Excel Rate函数。我确实获得了一些代码,这些代码对于其他Excel函数来说运行正常,但对于Rate函数来说却不稳定

涉及两个步骤:

1。计算付款

PMT($rate/12, $nper*12, $pv, $fv, $type)
$rate = .08 // interest rate
$nper = 30 // loan term in years
$pv = (100000 + 4000) // loan amt + loan fees
$fv = 0
$type = 0
PMT = -$763.12 // my PHP result and Excel result
2。计算利率

RATE($nper, $pmt, $pv, $fv, $type, $guess)
$nper = 360
$pmt = -763.12 // must remain negative in formula
$pv = 100000 // loan amt only (excludes loan fees)
$fv = 0
$type = 0
$guess = 0.09 // excel default is 0.10 but it doesn’t work so I lowered
RATE = 0.00701507 // Excel result (correct)
RATE = 0.0048541 // my PHP result (incorrect)
好的,这里有个陷阱。当利率从0.08更改为0.07时,结果是更低的PMT为691.91美元,这使得两个利率几乎相同

RATE = 0.0061609831 // Excel
RATE = 0.0061609269 // my PHP
我的问题是:你们有人在PHP中使用过Excel RATE函数吗?如果你成功了,请与我分享你的配方。或者你遇到了这个问题并找到了解决方法,那么请告诉我你做了什么。谢谢。

你知道在PHP(和其他一些语言)中
floor((0.1+0.7)*10)
等于7而不是8吗

我很确定这都是因为“细微差别”:

<> P>而不是在计算中使用浮点数,考虑使用<强> BCMase函数,这保证了所有数字表示为字符串时的高精度:


相关:

查看此解决方案:

<?php
define('FINANCIAL_MAX_ITERATIONS', 128);
define('FINANCIAL_PRECISION', 1.0e-08);
function RATE($nper, $pmt, $pv, $fv = 0.0, $type = 0, $guess = 0.1) {
    $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;
    $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 (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;
}
$nper = 60;
$pmt = 93.22;
$pv = -5000;
$fv = 0;
$type = 0;
$guess = 0.09;
var_dump(RATE($nper, $pmt, $pv, $fv, $guess));
?>

谢谢你,懒汉。我将探索这些链接。不过我是个新手,所以我可能需要一段时间。可能是重复的