楊博凱二分法求內部報酬率

head/head, body/body畫蛇添足,可拿掉,因為部落格架構已經下這些命令。資訊科學系的必修課「數值方法」或是應用數學系的必修課「數值分析」。
躉繳第1期第2期第3期

注意,包含首期躉繳的現金流量都大於0。

輸出:

報酬率:

淨現值:

迴圈次數:

楊博凱學習程式設計程式碼如下

<IFRAME WIDTH='100%'SRC='https://zh.wikipedia.org/zh-tw/%E4%BA%8C%E5%88%86%E6%B3%95_(%E6%95%B8%E5%AD%B8)'></IFRAME>

head/head, body/body畫蛇添足,可拿掉,因為部落格架構已經下這些命令
<style>
h1 {margin: 0;padding:20px 0;color:black;  text-shadow: 4px 4px 2px pink;}
.Takming {border: 20px outset red;background-color: green;
  color: white; text-align: center;}
.pmt {width: 60pt;height: 20pt;background-color: coral;
  color: white; text-align: right;}
</style>
<table border="1">
<tr align="center"><td>躉繳</td><td>第1期</td><td>第2期</td><td>第3期</td></tr>
<tr><td><input class="pmt" type="number" /></td>
   <td><input class="pmt" type="number" /></td>
   <td><input class="pmt" type="number" /></td>
   <td><input class="pmt" type="number" /></td></tr>
</table><br />
注意,包含首期躉繳的現金流量都大於0。
<p><input onclick="IRR()" type="button" value="計算內部報酬率" />輸出:</p> <!-- 按下 button 去執行 JavaScript IRR( )-->
<p>報酬率:<b id="irr"></b></p> 
<p>淨現值:<b id="npv"></b></p> 
<p>迴圈次數:<b id="loopNumber"></b></p> 
<script>
const period=4;
const maxerror = 0.0000001; //要求的精確度
var payment = new Array(period);
function IRR()//函數IRR語言Javascript的註解//不同於Python註解#
{ var a = 0;//變數a利率的起始下限
  var b = 1;//變數b利率的起始上限
  var c;
  var f;
  var gap=10;
  var loopNumber = 0;
  for (var i=0; i<period; i++)
    payment[i]=document.getElementsByClassName("pmt")[i].value;
  f = npv(a);
  if ( f==0 )
      document.getElementById("irr").innerHTML = "內部報酬率等於0.";
  else if ( f<0 )
    document.getElementById("irr").innerHTML = "內部報酬率小於0.";
  else
   { while ( gap > maxerror && Math.abs(f) > maxerror && loopNumber < 100)
     { 
      loopNumber++;
      c = (a+b)/2;
      f = npv(c);
      if ( Math.abs(f) > maxerror && gap > maxerror)
     { if ( f>0 )
        a = c;
       else
        b = c;
       gap = b-a;
      }
    }  //迴圈while結束
   }
  document.getElementById("irr").innerHTML= c;
  document.getElementById("npv").innerHTML= f;
  document.getElementById("loopNumber").innerHTML = loopNumber;
var npv=function(rate)//函數計算npv=net preset value淨現值
{   var y= -payment[0]; 
    for (var j=1; j<period; j++)
      y = y + payment[j]/(1+rate)**j;
    return y;//所有語言都使用return回傳函數計算的結果
}
</script>
<h1 class="Takming">楊博凱學習程式設計程式碼如下</h1>

留言

這個網誌中的熱門文章

楊博凱Javascript與Python比較

楊博凱STYLE,SCRIPT在HTML之後

楊博凱eval()內建函數data type資料型態