函数写得有点乱,但是没有什么问题
<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 = 1 ;i < 10 ;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.888,2)
//-->
</SCRIPT>

解决方案 »

  1.   

    上面的代码有点问题,用下面的
    <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>
      

  2.   

    try:<SCRIPT LANGUAGE="JavaScript">
    <!--
    function test(a, b) {
    var x,y,z;
    y=z=b=Math.pow(10,b);
    x=a=a*b;
    while(x>0){z=x;x=y%z;y=z};
    return(a/z+"/"+b/z);
    }
    alert(test(0.75,2));
    //-->
    </SCRIPT>
      

  3.   

    <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>
      

  4.   

    谢谢大家的回答,但还是没有解决问题。
    我的结果要求分母并不是100的形式,而是分母,分子都需要是整数。得出一个分数最接近dec的值。
      

  5.   

    因为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>
      

  6.   

    /**
     带精度的四舍五入
    */
    function NumberRound(value,num){
      value = value * Math.pow(10,num);
    value = Math.round(value);
    value = value / Math.pow(10,num);
    }
    写错了,忘记返回值了。
    改为:
    /**
     带精度的四舍五入
    */
    function NumberRound(value,num){
      value = value * Math.pow(10,num);
      value = Math.round(value);
      value = value / Math.pow(10,num);
      return value;}
      

  7.   

    alert(DecimalToFraction(1.751,2));//转换后结果为7/4
    alert(DecimalToFraction(1.745,2));//转换后结果为7/4
      

  8.   

    我们定义了下面的规则:按精度4舍5入,找最小分母的一个分数。
    假设现在是4位的精度,我们把0.3442转成分数,将会出现下面的可能性,新的规则会选95/276,不选21/61 因为 0.34426 按4位精度 4舍 5入后,会变成0.3443。
    0.3442会有下面相近的分数
    11/32 = 0.34375
    21/61 =0.3442622295
    95/276= 0.34420289
    1721/5000 =0.3442谢谢大家,问题基本已经解决,是由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>