redondeo - reducir decimales javascript
JavaScript math, redondeado a dos decimales (13)
Aquí hay un ejemplo de trabajo.
var value=200.2365455;
result=Math.round(value*100)/100 //result will be 200.24
Esta pregunta ya tiene una respuesta aquí:
Tengo la siguiente sintaxis de JavaScript:
var discount = Math.round(100 - (price / listprice) * 100);
Esto redondea hasta el número entero. ¿Cómo puedo devolver el resultado con dos decimales?
Creo que la mejor manera en que lo he visto hacer es multiplicar por 10 la potencia de la cantidad de dígitos, luego hacer un Math.round y luego dividir por 10 la potencia de los dígitos. Aquí hay una función simple que uso en mecanografiado:
function roundToXDigits(value: number, digits: number) {
value = value * Math.pow(10, digits);
value = Math.round(value);
value = value / Math.pow(10, digits);
return value;
}
O simplemente JavaScript:
function roundToXDigits(value, digits) {
if(!digits){
digits = 2;
}
value = value * Math.pow(10, digits);
value = Math.round(value);
value = value / Math.pow(10, digits);
return value;
}
La mejor y simple solución que encontré es
function round(value, decimals) {
return Number(Math.round(value+''e''+decimals)+''e-''+decimals);
}
round(1.005, 2); // 1.01
Referencia: http://www.jacklmoore.com/notes/rounding-in-javascript/
Las funciones Math.round () y .toFixed () están diseñadas para redondear al entero más cercano. Obtendrá resultados incorrectos al tratar con decimales y al usar el método de "multiplicar y dividir" para Math.round () o el parámetro para .toFixed (). Por ejemplo, si intenta redondear 1.005 usando Math.round (1.005 * 100) / 100, obtendrá el resultado de 1 y 1.00 usando .toFixed (2) en lugar de obtener la respuesta correcta de 1.01.
Puedes usar lo siguiente para resolver este problema:
Number(Math.round(100 - (price / listprice) * 100 + ''e2'') + ''e-2'');
Agregue .toFixed (2) para obtener los dos decimales que desea.
Number(Math.round(100 - (price / listprice) * 100 + ''e2'') + ''e-2'').toFixed(2);
Podrías hacer una función que maneje el redondeo por ti:
function round(value, decimals) {
return Number(Math.round(value + ''e'' + decimals) + ''e-'' + decimals);
}
Ejemplo: https://jsfiddle.net/k5tpq3pd/36/
Alternativ
Puedes agregar una función redonda a Número usando prototipo. No sugeriría agregar .toFixed () aquí, ya que devolvería una cadena en lugar de un número.
Number.prototype.round = function(decimals) {
return Number((Math.round(this + "e" + decimals) + "e-" + decimals));
}
y úsalo así:
var numberToRound = 100 - (price / listprice) * 100;
numberToRound.round(2);
numberToRound.round(2).toFixed(2); //Converts it to string with two decimals
Ejemplo https://jsfiddle.net/k5tpq3pd/35/
Fuente: http://www.jacklmoore.com/notes/rounding-in-javascript/
Para manejar el redondeo a cualquier número de decimales, una función con 2 líneas de código será suficiente para la mayoría de las necesidades. Aquí hay algunos ejemplos de código para jugar.
var testNum = 134.9567654;
var decPl = 2;
var testRes = roundDec(testNum,decPl);
alert (testNum + '' rounded to '' + decPl + '' decimal places is '' + testRes);
function roundDec(nbr,dec_places){
var mult = Math.pow(10,dec_places);
return Math.round(nbr * mult) / mult;
}
Para obtener el resultado con dos decimales, puedes hacer esto:
var discount = Math.round((100 - (price / listprice) * 100) * 100) / 100;
El valor a redondear se multiplica por 100 para mantener los dos primeros dígitos, luego dividimos por 100 para obtener el resultado real.
Si usa un plus unario para convertir una cadena en un número como se documenta en MDN .
Por ejemplo: +discount.toFixed(2)
Una pequeña variación en la respuesta aceptada. toFixed(2)
devuelve una cadena, y siempre obtendrás dos decimales. Estos podrían ser ceros. Si desea suprimir el (los) cero (s) final (es), simplemente haga esto:
var discount = + ((price / listprice).toFixed(2));
Editado: acabo de descubrir lo que parece ser un error en Firefox 35.0.1, lo que significa que lo anterior puede dar a NaN con algunos valores.
He cambiado mi código a
var discount = Math.round(price / listprice * 100) / 100;
Esto da un número con hasta dos decimales. Si quisieras tres, multiplicarías y dividirías por 1000, y así sucesivamente.
El OP quiere dos posiciones decimales siempre, pero si se rompe el Fallado () en Firefox, primero se debe corregir.
Ver https://bugzilla.mozilla.org/show_bug.cgi?id=1134388
intente usar discount.toFixed(2);
Forma más rápida - más rápido que toFixed ():
DOS DECIMALES
x = .123456
result = Math.round(x * 100) / 100 // result .12
Tres decimales
x = .123456
result = Math.round(x * 1000) / 1000 // result .123
NOTA: vea Edición 4 si la precisión de 3 dígitos es importante
var discount = (price / listprice).toFixed(2);
toFixed se redondeará hacia arriba o hacia abajo según los valores que superen los 2 decimales.
Ejemplo: http://jsfiddle.net/calder12/tv9HY/
Documentación: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed
Editar - Como lo mencionaron otros, esto convierte el resultado en una cadena. Para evitar esto:
var discount = +((price / listprice).toFixed(2));
Edición 2 : como también se menciona en los comentarios, esta función falla con cierta precisión, en el caso de 1.005, por ejemplo, devolverá 1.00 en lugar de 1.01. Si la precisión en este grado es importante, he encontrado esta respuesta: https://.com/a/32605063/1726511 Lo que parece funcionar bien con todas las pruebas que he probado.
Sin embargo, se requiere una modificación menor, la función en la respuesta vinculada anteriormente devuelve números enteros cuando se redondea a uno, por lo que, por ejemplo, 99.004 devolverá 99 en lugar de 99.00, lo cual no es ideal para mostrar precios.
Edición 3 - Parece que tener el TOFixed en la declaración real fue AÚN MOSTRANDO algunos números, esta edición final parece funcionar. ¡Caray tantas reelaboraciones!
var discount = roundTo((price / listprice), 2);
function roundTo(n, digits) {
if (digits === undefined) {
digits = 0;
}
var multiplicator = Math.pow(10, digits);
n = parseFloat((n * multiplicator).toFixed(11));
var test =(Math.round(n) / multiplicator);
return +(test.toFixed(digits));
}
Vea el ejemplo de Fiddle aquí: https://jsfiddle.net/calder12/3Lbhfy5s/
Edit 4 - Ustedes me están matando. La Edición 3 falla en números negativos, sin investigar por qué es más fácil tratar con un número negativo positivo antes de hacer el redondeo, y luego volverlo antes de devolver el resultado.
function roundTo(n, digits) {
var negative = false;
if (digits === undefined) {
digits = 0;
}
if( n < 0) {
negative = true;
n = n * -1;
}
var multiplicator = Math.pow(10, digits);
n = parseFloat((n * multiplicator).toFixed(11));
n = (Math.round(n) / multiplicator).toFixed(2);
if( negative ) {
n = (n * -1).toFixed(2);
}
return n;
}
function discoverOriginalPrice(discountedPrice, salePercentage) {
var originalPrice = discountedPrice / (1 - (salePercentage * .01));
return +originalPrice.toFixed(2);
}
function round(num,dec)
{
num = Math.round(num+''e''+dec)
return Number(num+''e-''+dec)
}
//Round to a decimal of your choosing:
round(1.3453,2)