Javascript的代碼,具體要求為將任意小數轉化為分數的形式

來源:互聯網
上載者:User
<SCRIPT   LANGUAGE=javascript>  
  <!--  
   
  function   DecimalToFraction(dec,digit){  
  dec   =   Math.round(dec   *   (Math.pow(10,digit)))   /   Math.pow(10,digit)   ;  
  var   tmpa,tmpb  
  tmpa   =   dec*100  
  tmpb   =100  
  for   (var   i   =   100   ;i   >0   ;i--){  
  var   tmp   =   (tmpa/i).toString();  
  var   tmp2   =   tmp.indexOf(".")  
  if   (   tmp2   ==   -1){  
  var   tmp3   =   (tmpb/i).toString();  
  var   tmp4   =   tmp3.indexOf(".")  
  if   (   tmp4   ==   -1   ){  
  tmpa   =   tmpa/i  
  tmpb   =   tmpb/i  
  }  
  }  
  }  
  alert(tmpa+"/"+tmpb)  
  }  
  DecimalToFraction(0.25,2)  
  //-->  
  </SCRIPT>  

//----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------

<SCRIPT   LANGUAGE="JavaScript">  
  <!--  
  /**  
    格式化小數  
  */  
  function   FormatNumber(value,num){  
  var   valuelen   =   String(value).length;  
  var   pointpos   =   String(value).indexOf(".");  
  var   decimalcount   =0;  
  if(pointpos==-1){  
  decimalcount   =0;  
  }else{  
      decimalcount   =   valuelen-pointpos-1;      
      }  
      if(decimalcount<=num){  
      return   value;  
  }else   if(decimalcount<=num+1){  
  value   =   NumberRound(value,num);        
  alert(value);  
  return   value;  
  }else{  
      var   templen   =   decimalcount   -   num   -1;  
      var   endpos   =   valuelen-templen;      
      var   valuestr   =   String(value).substring(0,endpos);      
      value   =   parseFloat(valuestr);      
      value     =   NumberRound(value,num);      
      return   value;      
  }  
  }  
  /**  
    帶精度的四捨五入  
  */  
  function   NumberRound(value,num){  
      value   =   value   *   Math.pow(10,num);  
  value   =   Math.round(value);  
  value   =   value   /   Math.pow(10,num);  
  }  
   
  /**  
  將小數轉為分數  
  */  
  function   DecimalToFraction(dec,digit){  
  dec   =   FormatNumber(dec,digit);  
  alert(dec);  
  var   decx,decy,decz;  
  decy=decz=digit=Math.pow(10,digit);  
  decx=dec=dec*digit;  
  while(decx>0){  
  decz=decx;  
  decx=decy%decz;  
  decy=decz  
  }  
  return(dec/decz+"/"+digit/decz);  
  }  
  alert(DecimalToFraction(1.751,2));  
  alert(DecimalToFraction(1.745,2));  
  //-->  
  </SCRIPT>

因為JavaScript在計算浮點數上的缺陷,我用VBScript實現  
   
  <script   language="VBScript">  
  Function   DecimalToFraction(dec)  
  If   dec=0   Then  
  DecimalToFraction="0"  
  Exit   Function  
  End   If  
  If   Fix(dec)=Dec   Then  
  DecimalToFraction="1"   /   CStr(dec)  
  Exit   Function  
  End   If  
  Dim   fm   :   fm=1/dec  
  If   Fix(fm)=fm   Then  
  DecimalToFraction="1   /   "   &   CStr(fm)  
  Exit   Function  
  End   If  
  Dim   nfm   :   nfm=fm  
  Dim   i   :   i=1  
  WHile   True  
  fz=i  
  fm=nfm*i  
  If   Fix(fm)=fm   Then  
  DecimalToFraction=CStr(i)   &   "   /   "   &   CStr(fm)  
  Exit   Function  
  End   If  
  i=i+1  
  If   i>32768   Then  
  DecimalToFraction="溢出"  
  Exit   Function  
  End   If  
  Wend  
  End   Function  
  MsgBox   DecimalToFraction(3.14)  
  </script>   

先把分子變成1,分母為任意小數  
  然後在保證分子始終是整數的前提下,從1開始向上搜尋  
  同時分母乘以相同的數,直到分母變成整數,或者太大了導致溢出
 

謝謝大家,問題基本已經解決,是由C#代碼轉化過來的。函數用了不少,感覺JS確實函數不夠豐富,好多都需要自己編寫。  
  謝謝  
  代碼如下:  
  <script   lang="javascript">  
  String.prototype.trim   =   function()  
  {  
  return   this.replace(/(^\s*)|(\s*$)/g,   "");  
  }  
  //按精度四捨五入  
  function   FormatNumber(b,a)  
  {  
        return   Math.round(b*Math.pow(10,a))/Math.pow(10,a);  
  }  
     
  function   DecimalToFraction(dec,_digit)  
  {  
  var   returnF=String(dec);  
  var   NUMFRACS=30;  
  var   numerator   =   new   Array();  
  var   denominator   =   new   Array();  
  var   IsMinus   =   false;  
  if(dec<0)  
  {  
  IsMinus=true;  
  }  
  dec=Math.abs(dec);  
  var   pre   =   Math.floor(dec);  
   
  var   _dec   =   FormatNumber(dec-pre,_digit);  
   
  var   d=0,   d2=0,   d3,   d4   =   -1;  
  var       maxNumerator,   L2;  
   
  d   =   d2   =   _dec;  
   
  maxNumerator   =   getMaxNumerator(d.toString(10));  
   
  numerator[0]=0;   denominator[0]=1;  
  numerator[1]=1;   denominator[1]=0;  
   
  for(var   i=2;   i<NUMFRACS;   i++)  
  {  
  L2   =   Math.round(d2);  
  numerator[i]=L2*numerator[i-1]   +   numerator[i-2];  
  denominator[i]=L2*denominator[i-1]   +   denominator[i-2];  
  d3   =   (numerator[i])/(denominator[i]);  
  if(d3==d4)    
  {  
  break;  
  }  
  if(Math.abs(numerator[i])   >   maxNumerator)    
  {  
  break;  
  }  
   
  if(d3==d)    
  {  
  break;  
  }  
  d4=d3;  
  d2   =   1/(d2-L2);  
  }  
   
  for(var   i=0;   i<NUMFRACS;   i++)  
  {  
  var   h=0;  
  if(denominator[i]!=0)  
  {  
        h   =   parseFloat(numerator[i])/parseFloat(denominator[i]);  
  }  
   
  if(denominator[i]!=0&&FormatNumber(h,_digit)==_dec)  
  {  
  returnF=Math.abs(numerator[i])+"/"+Math.abs(denominator[i]);  
  break;  
  }  
  }  
   
                          returnF   =   (IsMinus?"-":"")+(pre==0?"":pre)+("   "+returnF);  
  return   returnF.trim();  
  }  
   
  function   getMaxNumerator(f)  
  {  
  var   f2   =   null;  
  var   ixe   =   f.indexOf("E");  
  if(ixe==-1)   ixe   =   f.indexOf("e");  
  if(ixe   ==   -1)   f2   =   f;  
  else   f2   =   f.substr(0,   ixe);  
   
  var   digits   =   null;  
  var   ix   =   f2.indexOf(".");  
  if(ix==-1)  
  {  
  digits   =   f2;  
  }  
  else   if(ix==0)    
  {  
  digits   =   f2.substr(1,   f2.length);  
  }  
  else   if(ix<f2.length)  
  {  
  digits   =   f2.substr(0,   ix)+f2.substr(ix+1);  
  }  
   
  var   L;  
  try  
  {  
  L   =   parseInt(digits);  
  }  
  catch(e)  
  {  
                                return   999999999;  
  }  
   
  var   numDigits   =   L.length;  
   
  var   L2   =   f.length;  
  var   numIntDigits   =L2.length;  
  if(L2==0)   numIntDigits   =   0;  
  var   numDigitsPastDecimal   =   numDigits   -   numIntDigits;  
   
  for(var   i=numDigitsPastDecimal;   i>0   &&   L%2==0;   i--)   L/=2;  
  for(var   i=numDigitsPastDecimal;   i>0   &&   L%5==0;   i--)   L/=5;  
   
  return   L;  
  }  
   
  function   GetFraction()  
  {  
          var   dec   =   parseFloat(document.all["txtDec"].value);  
          var   digit   =   parseInt(document.all["txt"].value);  
          document.all["txtFraction"].value   =   DecimalToFraction(dec,digit);  
  }  
  </script>   
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.