Saltar al contenido

Matemáticas de JavaScript, redondear a dos decimales

Si hallas algún fallo en tu código o proyecto, recuerda probar siempre en un ambiente de testing antes aplicar el código al trabajo final.

Solución:

NOTA: consulte la Edición 4 si la precisión de 3 dígitos es importante

var discount = (price / listprice).toFixed(2);

toFixed redondeará hacia arriba o hacia abajo dependiendo de los valores más allá de 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 mencionaron otros, esto convierte el resultado en un string. Para evitar esto:

var discount = +((price / listprice).toFixed(2));

Editar 2– Como también se mencionó 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, encontré esta respuesta: https://stackoverflow.com/a/32605063/1726511 que parece funcionar bien con todas las pruebas que probé.

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, que no es ideal para mostrar precios.

Editar 3 – Parece que tener el toFixed en el retorno real TODAVÍA estaba arruinando algunos números, esta edición final parece funcionar. ¡Caramba, tantos reworks!

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/

Editar 4 – Ustedes, chicos, me están matando. La Edición 3 falla en los números negativos, sin profundizar en por qué es más fácil lidiar con convertir un número negativo en positivo antes de redondear, y luego devolverlo 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(digits);
    if (negative) 
        n = (n * -1).toFixed(digits);
    
    return n;

Violín: https://jsfiddle.net/3Lbhfy5s/79/

Si usa una suma unaria para convertir un string a un número como se documenta en MDN.

Por ejemplo:+discount.toFixed(2)

Las funciones Math.round() y .toFixed() están diseñadas para redondear al entero más cercano. Obtendrá resultados incorrectos cuando trate con decimales y utilice el método "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.

Puede usar lo siguiente para resolver este problema:

Number(Math.round(100 - (price / listprice) * 100 + 'e2') + 'e-2');

Agregue .toFixed(2) para obtener los dos lugares decimales que deseaba.

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/

alternativa

Puede agregar una función redonda a Número usando prototipo. No sugeriría agregar .toFixed() aquí, ya que devolvería un string en lugar de número.

Number.prototype.round = function(decimals) 
    return Number((Math.round(this + "e" + decimals)  + "e-" + decimals));

y usarlo 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/

Más adelante puedes encontrar los informes de otros usuarios, tú asimismo puedes mostrar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *