viceversa transformar profe número fracción fracciones ejercicios decimales convertir convertidor comunes como javascript decimal fractions rational-numbers

javascript - transformar - Convertir un número decimal a una fracción/número racional



convertir fracción decimal a número decimal (11)

¿Has probado algo como esto?

<script type="texrt/javascript> var cnum = 3.5,deno = 10000,neww; neww = cnum * deno; while(!(neww % 2 > 0) && !(deno % 2 > 0)){ neww = neww / 2; deno = deno / 2; } while(!(neww % 3 > 0) && !(deno % 3 > 0)){ neww = neww / 3; deno = deno / 3; } while(!(neww % 5 > 0) && !(deno % 5 > 0)){ neww = neww / 5; deno = deno / 5; } while(!(neww % 7 > 0) && !(deno % 7 > 0)){ neww = neww / 7; deno = deno / 7; } while(!(neww % 11 > 0) && !(deno % 11 > 0)){ neww = neww / 11; deno = deno / 11; } while(!(neww % 13 > 0) && !(deno % 13 > 0)){ neww = neww / 13; deno = deno / 13; } while(!(neww % 17 > 0) && !(deno % 17 > 0)){ neww = neww / 17; deno = deno / 17; } while(!(neww % 19 > 0) && !(deno % 19 > 0)){ neww = neww / 19; deno = deno / 19; } console.log(neww+"/"+deno); </script>

En JavaScript, ¿hay alguna forma de convertir un número decimal (como 0.0002 ) en una fracción representada como una cadena (como " 2/10000" )?

Si una función llamada decimalToFraction hubiera escrito para este propósito, entonces decimalToFraction(0.0002) devolvería la cadena "2/10000" .


Esto puede ser un poco antiguo, pero el código que se publicó falla en 0 valores. He corregido ese error y publicaré el código actualizado a continuación.

//function to get highest common factor of two numbers (a fraction) 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 fraction function 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 if(isNaN(whole) === true) { whole = "0"; } if(isNaN(decimal) === true) { return ((whole==0)?"0" : whole); } else { return ((whole==0)?"0 " : whole+" ")+decimal/t+"/"+num/t; } }


Hay una solución muy simple usando la representación de cadenas de números.

string = function(f){ // returns string representation of an object or number return f+""; } fPart = function(f){ // returns the fraction part (the part after the ''.'') of a number str = string(f); return str.indexOf(".")<0?"0":str.substring(str.indexOf(".") + 1); } wPart = function(f){ // returns the integer part (the part before the ''.'') of a number str = string(f); return str.indexOf(".")<0?str:str.substring(0, str.indexOf(".")); // possibility 1 //return string(f - parseInt(fPart(f))); // just substract the fPart } power = function(base, exp){ var tmp = base; while(exp>1){ base*=tmp; --exp; } return base; } getFraction = function(f){ // the function var denominator = power(10, fPart(f).length), numerator = parseInt(fPart(f)) + parseInt(wPart(f))*denominator; return "[ " + numerator + ", " + denominator + "]"; } console.log(getFraction(987.23));

que solo verificará cuántos números hay en la fracción y luego expande la fracción de f / 1 hasta que f sea un número entero. Esto puede llevar a grandes fracciones, por lo que puede reducirlo al dividir tanto el numerador como el denominador por el mayor divisor común de ambos, por ejemplo,

// greatest common divisor brute force gcd = function(x,y){ for(var i = Math.min(x, y);i>0;i--) if(!(x%i||y%i)) return i; return 1; }


Hice lo que Popnoodles sugirió y aquí está

function FractionFormatter(value) { if (value == undefined || value == null || isNaN(value)) return ""; function _FractionFormatterHighestCommonFactor(u, v) { var U = u, V = v while (true) { if (!(U %= V)) return V if (!(V %= U)) return U } } var parts = value.toString().split(''.''); if (parts.length == 1) return parts; else if (parts.length == 2) { var wholeNum = parts[0]; var decimal = parts[1]; var denom = Math.pow(10, decimal.length); var factor = _FractionFormatterHighestCommonFactor(decimal, denom) return (wholeNum == ''0'' ? '''' : (wholeNum + " ")) + (decimal / factor) + ''/'' + (denom / factor); } else { return ""; } }


La buena noticia es que es posible, pero tendrás que convertirlo en código.

Vamos con 2.56 sin ninguna razón.

Usa la parte decimal del número .56

Hay 2 dígitos en .56, escriba .56 como 56/100.

Entonces, tenemos 2 + 56/100 y necesitamos reducir esta fracción a los términos más bajos al dividir tanto el numerador como el denominador por el mayor divisor común , que es 4 en este caso.

Entonces, esta fracción reducida a los términos más bajos es 2 + 14/25.

Para sumar esos 2 enteros, multiplicamos por el divisor y sumamos a los 14

(2 * 25 + 14) / 25 = 64/25


Muy antigua pregunta pero tal vez alguien pueda encontrar esto útil. Es iterativo, no recursivo y no requiere factorización.

function getClosestFraction(value, tol) { var original_value = value; var iteration = 0; var denominator=1, last_d = 0, numerator; while (iteration < 20) { value = 1 / (value - Math.floor(value)) var _d = denominator; denominator = Math.floor(denominator * value + last_d); last_d = _d; numerator = Math.ceil(original_value * denominator) if (Math.abs(numerator/denominator - original_value) < tol) break; iteration++; } return {numerator: numerator, denominator: denominator}; };


Puede usar la biblioteca fraction.js Erik Garrison para hacer eso y más operaciones fraccionarias.

var f = new Fraction(2, 10000); console.log(f.numerator + ''/'' + f.denominator);

Para hacer .003 puedes hacer

var f = new Fraction(.003); console.log(f.numerator + ''/'' + f.denominator);


Sé que esta es una pregunta antigua, pero he creado una función que se ha simplificado enormemente.

Math.fraction=function(x){ return x?+x?x.toString().includes(".")?x.toString().replace(".","")/(function(a,b){return b?arguments.callee(b,a%b):a;})(x.toString().replace(".",""),"1"+"0".repeat(x.toString().split(".")[1].length))+"/"+("1"+"0".repeat(x.toString().split(".")[1].length))/(function(a,b){return b?arguments.callee(b,a%b):a;})(x.toString().replace(".",""),"1"+"0".repeat(x.toString().split(".")[1].length)):x+"/1":NaN:void 0; }

Llámalo con Math.fraction(2.56)

Va a:

  • devuelve NaN si la entrada no es un número
  • devuelve undefined si la entrada no está definida
  • reducir la fracción
  • devuelve una string (use Math.fraction(2.56).split("/") para una matriz que contenga el numerador y el denominador)

Tenga en cuenta que esto utiliza los arguments.callee desuso. Puede ser incompatible en algunos navegadores.

Pruébalo here


Solo quiero dejar una alternativa que encontré para convertir números decimales en fracciones y reducir fracciones , es una biblioteca JS.

La biblioteca llama a fraction.js , fue muy útil para mí y me ahorró mucho tiempo y trabajo. ¡La esperanza puede ser útil para alguien más!


Un poco de googlear con el término "decimal a fracción js" el primero produjo esto:

http://wildreason.com/wildreason-blog/2010/javascript-convert-a-decimal-into-a-simplified-fraction/

Parece funcionar:

http://jsfiddle.net/VKfHH/

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 fraction function 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 it alert(fraction(0.0002)); // "1/5000"


Utilicé este sitio http://mathforum.org/library/drmath/view/51886.html para construir una función, pero como el artículo menciona, obtendrás un gran número irrazonable de radicales o pi.

Espero que ayude sin embargo.

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