前の版を達成します。https://www.cnblogs.com/Alex-Zeng/p/9334582.html
前の版で達成、いくつかのケースでは負を計算し、Excelの計算が異なっています。だから、実装を変更。
以下を達成するために特定のコード:
関数 IRR_ZEN(p_amount_array で typ_cashflow_array)RETURN NUMBERで ある rtn_err 番号:= 0 ; irrGuess 番号:= 0.01。- デフォルト:10% IRRの 数:= 0.0 。 minDistanceの 数:= 1E - 15。- 繰り返し:小さい距離、小さい補間 maxIterationの整数:= 1000年; 和紙ブール:= falseは、 noOfCashFlows 整数:= 0 ; cashValueの 数:= 0.0 。 cashFlowStartの数:= 0.0 。 result_value 番号:= 0.0 。 BEGIN IRR:= irrGuess。 result_value:= - 999999 ; noOfCashFlows:= p_amount_array。数えます; -ビジネスのスタートアップは、コスト cashFlowStart:= p_amount_array(1 ); 以下のための私で 1 .. maxIterationループ - 現在のIRRと計算現金価値: cashValue:= cashFlowStart。- 起動時のコストとのinit - 各キャッシュフローの ための J で 2 .. noOfCashFlowsループ cashValue:= cashValue + p_amount_array(J)/ パワー(1.0 + IRR、J - 1 )。 終わりループ; - 現金値はほぼゼロである 場合(ABS(cashValue)< 0.0000000001)次に - DBMS_OUTPUT.PUT_LINE( 'ABS(cashValue)<0.0000000001:' || TO_CHAR(cashValue))。 result_value:= IRR; 終了; 終了し た場合、 - 次の反復のためIRR調整: - 現金値> 0 =>次IRR>現在のIRR 場合(cashValue > 0)、次いで 場合和紙次いで :irrGuess = irrGuess / 2; 終了し た場合、 IRR:= IRR + irrGuess。 もし和紙その後、 irrGuess:= irrGuess - minDistance。 和紙:= falseは、 終了し た場合、 他の - 現金値<0 =>次のIRR <現在のIRR irrGuess:= irrGuess / 2 ; IRR:= IRR - irrGuess。 和紙:= はtrue。 エンド 場合; - 推定結果を続行するには小さすぎる=>エンド - 計算 場合(irrGuess <= minDistance)次に - DBMS_OUTPUT.PUT_LINE( 'irrGuess <= minDistance:' || TO_CHAR(irrGuess))。 result_value:= IRR; 終了; 終了し た場合、 エンドループ; リターンresult_value。 EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SUBSTR(SQLERRM、1、640 )); リターンrtn_err。 END IRR_ZEN;