convert decimal number to fraction in javascript or closest fraction

后端 未结 10 1575
温柔的废话
温柔的废话 2020-12-05 16:12

So i want to be able to convert any decimal number into fraction. In both forms such as one without remainder like this: 3/5 or with remainder: 3 1/4

相关标签:
10条回答
  • 2020-12-05 16:43

    Unless you are willing to work on developing something yourself then I would suggest using a library that someone has already put effort into, like fraction.js

    Javascript

    var frac = new Fraction(0.3435);
    
    console.log(frac.toString());
    

    Output

    687/2000
    

    On jsFiddle

    0 讨论(0)
  • 2020-12-05 16:43

    I had researched all over the website and I did combine all code into one, Here you go!

    function fra_to_dec(num){
        var test=(String(num).split('.')[1] || []).length;
        var num=(num*(10**Number(test)))
        var den=(10**Number(test))
        function reduce(numerator,denominator){
            var gcd = function gcd(a,b) {
                return b ? gcd(b, a%b) : a;
            };
            gcd = gcd(numerator,denominator);
            return [numerator/gcd, denominator/gcd];
        }
        return (reduce(num,den)[0]+"/"+reduce(num,den)[1])
    }
    

    This code is very easy to use! You can even put number in this function!

    0 讨论(0)
  • 2020-12-05 16:43

    This is the fastest one I've got. No GCD. Good for at least 5 trailing decimals.

    function decToFrac(n)
    {
        let rcp = (n%1 == 0) ? 1: 1/(n%1);
        let den = rcp;
        const lim = 10;
        for (let i = 0; i < lim && Number.isInteger(Math.round(rcp * 10**(lim-i)) / 10**(lim-i)) != true; i++)
        {
            rcp = 1/(rcp%1);
            den *= rcp;
        }
        return [Math.round(n*den), Math.round(den)];
    }
    
    function impToProp(n, d)
    {
        return [Math.floor(n/d), (n%d), d];
    }
    
    var dec = 3.141592;
    var frac = decToFrac(dec); // improper
    var prop = impToProp(frac[0], frac[1]); // proper
    
    0 讨论(0)
  • 2020-12-05 16:46

    One quick and easy way of doing it is

    getFraction = (decimal) => {
      for(var denominator = 1; (decimal * denominator) % 1 !== 0; denominator++);
      return {numerator: decimal * denominator, denominator: denominator};
    }
    
    0 讨论(0)
提交回复
热议问题