<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>   
 
posted on 2007-12-25 14:52  ringnet  阅读(1263)  评论(0编辑  收藏  举报