javascript - transformar - ¿Convertir cadena de fracciones a decimal?
convertir fracciones a decimales y viceversa (12)
Algo como esto:
bits = fraction.split("/");
return parseInt(bits[0],10)/parseInt(bits[1],10);
Estoy tratando de crear una función javascript que puede tomar una cadena de entrada de fracción como ''3/2''
y convertirla a decimal, ya sea como una cadena ''1.5''
o el número 1.5
function ratio(fraction) {
var fraction = (fraction !== undefined) ? fraction : ''1/1'',
decimal = ??????????;
return decimal;
});
¿Hay alguna forma de hacer esto?
Aquí está el código mínimo necesario para hacer esto:
var a = "3/2";
var split = a.split(''/'');
var result = parseInt(split[0], 10) / parseInt(split[1], 10);
alert(result); // alerts 1.5
JsFiddle: http://jsfiddle.net/XS4VE/
Cosas para considerar:
- división por cero
- si el usuario le da un número entero en lugar de una fracción, o cualquier otra entrada no válida
- problemas de redondeo (como 1/3 por ejemplo)
Como nadie lo ha mencionado aún, hay una solución rápida y sucia:
var decimal = eval(fraction);
Que tiene las ventajas de evaluar correctamente todo tipo de cadenas matemáticas.
eval("3/2") // 1.5
eval("6") // 6
eval("6.5/.5") // 13, works with decimals (floats)
eval("12 + 3") // 15, you can add subtract and multiply too
La gente aquí mencionará rápidamente los peligros de usar una evaluación en bruto, pero presento esto como respuesta del perezoso.
Creé una buena función para hacer precisamente eso, todo estaba basado en esta pregunta y respuestas, pero tomará la cadena y generará el valor decimal, pero también generará números enteros y errores.
https://gist.github.com/drifterz28/6971440
function toDeci(fraction) {
fraction = fraction.toString();
var result,wholeNum=0, frac, deci=0;
if(fraction.search(''/'') >=0){
if(fraction.search(''-'') >=0){
wholeNum = fraction.split(''-'');
frac = wholeNum[1];
wholeNum = parseInt(wholeNum,10);
}else{
frac = fraction;
}
if(fraction.search(''/'') >=0){
frac = frac.split(''/'');
deci = parseInt(frac[0], 10) / parseInt(frac[1], 10);
}
result = wholeNum+deci;
}else{
result = fraction
}
return result;
}
/* Testing values / examples */
console.log(''1 '',toDeci("1-7/16"));
console.log(''2 '',toDeci("5/8"));
console.log(''3 '',toDeci("3-3/16"));
console.log(''4 '',toDeci("12"));
console.log(''5 '',toDeci("12.2"));
Demasiado tarde, pero puede ser útil:
Puede usar Array.prototype.reduce
lugar de eval
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
ES6
const fractionStrToDecimal = str => str.split(''/'').reduce((p, c) => p / c);
console.log(fractionStrToDecimal(''1/4/2'')); // Logs 0.125
console.log(fractionStrToDecimal(''3/2'')); // Logs 1.5
CJS
function fractionStrToDecimal(str) {
return str.split(''/'').reduce((p, c) => p / c);
}
console.log(fractionStrToDecimal(''1/4'')); // Logs 0.25
[EDITAR] Se eliminó el valor inicial del reductor y ahora la función funciona para numeradores mayores que 1. Gracias, James Furey.
Función (ES6):
function fractionToDecimal(fraction) {
return fraction
.split(''/'')
.reduce((numerator, denominator, i) =>
numerator / (i ? denominator : 1)
);
}
Función (ES6, condensada):
function fractionToDecimal(f) {
return f.split(''/'').reduce((n, d, i) => n / (i ? d : 1));
}
Ejemplos:
fractionToDecimal(''1/2''); // 0.5
fractionToDecimal(''5/2''); // 2.5
fractionToDecimal(''1/2/2''); // 0.25
fractionToDecimal(''10/5/10''); // 0.2
fractionToDecimal(''0/1''); // 0
fractionToDecimal(''1/0''); // Infinity
fractionToDecimal(''cat/dog''); // NaN
Funciona con el método eval () pero puede usar el método parseFloat. Creo que es mejor! Desafortunadamente, solo funcionará con ese tipo de valores: "12.2" no con "5/8", pero como puede manejar el cálculo, creo que este es un buen enfoque.
Para convertir una fracción a un decimal, simplemente divide el número superior por el número inferior. 5 dividido por 3 sería 5/3 o 1.67. Muy parecido:
function decimal(top,bottom) {
return (top/bottom)
}
Espero que esto ayude, jaja
Si desea utilizar el resultado como una fracción y no solo obtener la respuesta de la cadena, una biblioteca como https://github.com/infusion/Fraction.js hará el trabajo bastante bien.
var f = new Fraction("3/2");
console.log(f.toString()); // Returns string "1.5"
console.log(f.valueOf()); // Returns number 1.5
var g = new Fraction(6.5).div(.5);
console.log(f.toString()); // Returns string "13"
Si no le importa usar una biblioteca externa, math.js ofrece algunas funciones útiles para convertir fracciones a decimales y realizar aritmética de números fraccionarios.
console.log(math.number(math.fraction("1/3"))); //returns 0.3333333333333333
console.log(math.fraction("1/3") * 9) //returns 3
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/3.20.1/math.js"></script>
También un poco tarde para la fiesta, pero una alternativa a eval()
con menos problemas de seguridad (al menos según MDN) es la fábrica Function()
.
var fraction = "3/2";
console.log( Function("return (" + fraction + ");")() );
Esto daría como resultado el resultado "1.5" en la consola.
También como nota al margen: las fracciones mixtas como 1 1/2 no funcionarán ni con eval()
ni con la solución con Function()
tal como están escritas, ya que ambos tropiezan en el espacio.
Tengo una función que uso para manejar enteros, fracciones mixtas (incluidos caracteres de fracción vulgar de Unicode) y decimales. Probablemente necesite un poco de pulido, pero funciona para mi propósito (análisis de la lista de ingredientes de la receta).
Las entradas "2 1/2"
, "2½"
, "2 ½"
y "2.5"
devolverán 2.5
. Ejemplos:
var numQty = require("numeric-quantity");
numQty("1 1/4") === 1.25; // true
numQty("3 / 4") === 0.75; // true
numQty("¼" ) === 0.25; // true
numQty("2½") === 2.5; // true
numQty("¾") === 0.75; // true
numQty("⅓") === 0.333; // true
numQty("⅔") === 0.667; // true
Una cosa que no maneja son los decimales dentro de la fracción, por ejemplo, "2.5 / 5"
.