2011-07-15 8 views
0

私が最後にこの質問を投稿したとき、私は何を求めているのか分かりませんでしたので、私は皆さんに腹を立てました...私はそれを吹きました、申し訳ありません。だからもう一度試してみましょう。PHPでExcelレート機能を正しく使用するにはどうすればよいですか?

私はPHPでExcel Rate関数を模倣しようとしています。私は、他のExcel関数では正しく機能するが、Rate関数では不安定なコードをいくつか手に入れました。

関与する2つのステップがあります。

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機能を使用することがありますか?あなたが成功したら、あなたの数式を私と共有してください。あるいは、あなたはこの問題に遭遇し、それを修正する方法を見つけました。あなたがしたことを教えてください。ありがとうございました。

答えて

0

PHP(およびその他の言語)では、floor((0.1+0.7)*10)は8でなく7に等しいことをご存知ですか?

私はそれがあるため、この「ニュアンス」のすべてであるかなり確信している:代わりに、あなたの計算で浮動小数点数を使用してのhttp://php.net/manual/en/language.types.float.php

、すべての数字は次のように表現されるように、高精度を保証BCMath機能を、使用することを検討してください文字列:http://php.net/manual/en/book.bc.php

関連:PHP - Floating Number Precision

+0

ありがとう、LazyOne。私はそれらのリンクを探求します。私は初心者ですので、しばらく時間がかかります。 –

0

は、このソリューションをチェックアウト:

<?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)); 
?> 
関連する問題