Convert a decimal number to a fraction / rational number
You can use Erik Garrison's fraction.js library to do that and more fractional operations.
var f = new Fraction(2, 10000);console.log(f.numerator + '/' + f.denominator);
To to do .003 you can just do
var f = new Fraction(.003);console.log(f.numerator + '/' + f.denominator);
A little googling with the term "decimal to fraction js" the first yielded this:
http://wildreason.com/wildreason-blog/2010/javascript-convert-a-decimal-into-a-simplified-fraction/
It seems to work:
function HCF(u, v) { var U = u, V = v while (true) { if (!(U%=V)) return V if (!(V%=U)) return U } }//convert a decimal into a fractionfunction fraction(decimal){ if(!decimal){ decimal=this; } whole = String(decimal).split('.')[0]; decimal = parseFloat("."+String(decimal).split('.')[1]); num = "1"; for(z=0; z<String(decimal).length-2; z++){ num += "0"; } decimal = decimal*num; num = parseInt(num); for(z=2; z<decimal+1; z++){ if(decimal%z==0 && num%z==0){ decimal = decimal/z; num = num/z; z=2; } } //if format of fraction is xx/xxx if (decimal.toString().length == 2 && num.toString().length == 3) { //reduce by removing trailing 0's decimal = Math.round(Math.round(decimal)/10); num = Math.round(Math.round(num)/10); } //if format of fraction is xx/xx else if (decimal.toString().length == 2 && num.toString().length == 2) { decimal = Math.round(decimal/10); num = Math.round(num/10); } //get highest common factor to simplify var t = HCF(decimal, num); //return the fraction after simplifying it return ((whole==0)?"" : whole+" ")+decimal/t+"/"+num/t;}// Test italert(fraction(0.0002)); // "1/5000"
I used this site http://mathforum.org/library/drmath/view/51886.html to build a function but as the article mentions you will get an unreasonable large number for radicals or pi.
Hope it helps though.
function Fraction(){}Fraction.prototype.convert = function(x, improper){ improper = improper || false; var abs = Math.abs(x); this.sign = x/abs; x = abs; var stack = 0; this.whole = !improper ? Math.floor(x) : 0; var fractional = !improper ? x-this.whole : abs; /*recursive function that transforms the fraction*/ function recurs(x){ stack++; var intgr = Math.floor(x); //get the integer part of the number var dec = (x - intgr); //get the decimal part of the number if(dec < 0.0019 || stack > 20) return [intgr,1]; //return the last integer you divided by var num = recurs(1/dec); //call the function again with the inverted decimal part return[intgr*num[0]+num[1],num[0]] } var t = recurs(fractional); this.numerator = t[0]; this.denominator = t[1];}Fraction.prototype.toString = function(){ var l = this.sign.toString().length; var sign = l === 2 ? '-' : ''; var whole = this.whole !== 0 ? this.sign*this.whole+' ': sign; return whole+this.numerator+'/'+this.denominator;}//var frac = new Fraction()//frac.convert(2.56, false)//console.log(frac.toString())//use frac.convert(2.56,true) to get it as an improper fraction
If you just want a self-contained function that only returns the numerator and denominator then use the function below.
var toFraction = function (dec) { var is_neg = dec < 0; dec = Math.abs(dec); var done = false; //you can adjust the epsilon to a larger number if you don't need very high precision var n1 = 0, d1 = 1, n2 = 1, d2 = 0, n = 0, q = dec, epsilon = 1e-13; while (!done) { n++; if (n > 10000) { done = true; } var a = parseInt(q); var num = n1 + a * n2; var den = d1 + a * d2; var e = (q - a); if (e < epsilon) { done = true; } q = 1 / e; n1 = n2; d1 = d2; n2 = num; d2 = den; if (Math.abs(num / den - dec) < epsilon || n > 30) { done = true; } } return [is_neg ? -num : num, den];};//Usage://var frac = toFraction(0.5);//console.log(frac)//Output: [ 1, 2 ]