¿Cómo redondear un número con una precisión de décimas en Javascript?

4 minutos de lectura

avatar de usuario de cyberfly
cibermosca

Quiero usar Javascript para redondear un número. Dado que el número es moneda, quiero que se redondee como en estos ejemplos (2 puntos decimales):

  • 192.168 => 192.20
  • 192.11 => 192.20
  • 192.21 => 192.30
  • 192.26 => 192.30
  • 192.20 => 192.20

¿Cómo lograr esto usando Javascript? La función incorporada de Javascript redondeará el número según la lógica estándar (menos y más de 5 para redondear).

Avatar de usuario de Andrew Marshall
andres marshall

/**
 * @param num The number to round
 * @param precision The number of decimal places to preserve
 */
function roundUp(num, precision) {
  precision = Math.pow(10, precision)
  return Math.ceil(num * precision) / precision
}

roundUp(192.168, 1) //=> 192.2

  • @AndrewMarshall, ¿cuál es el propósito de multiplicar y luego dividir por 10?

    – código vaquero

    7 de enero de 2013 a las 18:23

  • @codecowboy Si no lo hace, entonces ceil() Te regalaré 193, por lo que debemos asegurarnos de que toda la precisión que queremos mantener sea antes del punto decimal. Luego hacemos la operación inversa para restaurar el valor “original”.

    – Andrés Marshall

    7 de enero de 2013 a las 23:22


  • Si obtienes un número como 192.19999999999997puedes aplicar .toFixed(1) hacia num

    – flamer.ohr

    8 de marzo de 2016 a las 2:37

  • Y para aquellos aquí que se preguntan cómo redondear al número ENTERO más cercano, solo necesitan Math.ceil(). El resto es sólo para tratar con decimales. ¡Para salvar a otros el tiempo que le tomó a mi cerebro llegar a eso!

    usuario2493235

    30 de abril de 2016 a las 10:59


  • ¡CUIDADO ESTA FUNCIÓN NO ES TOTALMENTE PRECISA! roundUp(1.09, 2) devuelve 1.1 que es incorrecto. La respuesta esperada es 1.09 todavía.

    – Igual

    12 mayo 2020 a las 21:28

El redondeo normal funcionará con un pequeño ajuste:

Math.round(price * 10)/10

y si desea mantener un formato de moneda, puede usar el método Número .toFixed()

(Math.round(price * 10)/10).toFixed(2)

Aunque esto lo convertirá en una cadena =)

  • Ronda matemática (192.11 * 100)/100 -> 192.11

    – krtek

    4 de marzo de 2011 a las 7:57

  • El segundo no necesita redondeo, es más como price.toFixed(2)

    – Michael Krelin – hacker

    4 de marzo de 2011 a las 7:58

  • @Krtek ooops, gracias por captar eso. Leí mal la pregunta. Respuesta actualizada.

    – Sábalo

    4 de marzo de 2011 a las 7:59

  • El OP preguntó cómo redondear un número, por lo que Math.ceil debería usarse aquí en lugar de Math.round.

    – kloddant

    4 de abril de 2016 a las 13:38

avatar de usuario de suryakiran
suryakiran

Un poco tarde, pero puede crear una función javascript reutilizable para este propósito:

// Arguments: number to round, number of decimal places
function roundNumber(rnum, rlength) { 
    var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

Llame a la función como

alert(roundNumber(192.168,2));

  • Esto funciona muy bien, pero el OP preguntó cómo redondear un número, por lo que Math.ceil debería usarse aquí en lugar de Math.round.

    – kloddant

    4 de abril de 2016 a las 14:02

  • Esta respuesta es mejor que la respuesta aceptada si está buscando redondear correctamente a pesar del lugar decimal al que apunta. Ej: 1,054 –> 1,05 1,055 –> 1,06 SIN EMBARGO aquí hay un caso límite: 1,005 –> 1 1,006 –> 1,01 Y 1,015 –> 1,01 1,016 –> 1,02 Así que ten cuidado.

    – Jay K.

    1 de marzo de 2017 a las 4:41

Avatar de usuario de Hoàng Long
Hoang Long

muy cerca de El ojo respuesta, pero cambio una pequeña cosa para que funcione:

var num = 192.16;
    
console.log(    Math.ceil(num * 10) / 10    );

El OP espera dos cosas:
A. para redondear a los décimos superiores, y
B. para mostrar un cero en el lugar de las centésimas (una necesidad típica con la moneda).

El cumplimiento de ambos requisitos parece requerir un método separado para cada uno de los anteriores. Aquí hay un enfoque que se basa en la respuesta sugerida por suryakiran:

//Arguments: number to round, number of decimal places.

function roundPrice(rnum, rlength) {
    var newnumber = Math.ceil(rnum * Math.pow(10, rlength-1)) / Math.pow(10, rlength-1);
    var toTenths = newnumber.toFixed(rlength);
    return toTenths;
}

alert(roundPrice(678.91011,2)); // returns 679.00
alert(roundPrice(876.54321,2)); // returns 876.60

Nota importante: esta solución produce un resultado muy diferente con números negativos y exponenciales.

En aras de la comparación entre esta respuesta y dos que son muy similares, consulte los siguientes 2 enfoques. El primero simplemente redondea a la centésima más cercana como de costumbre, y el segundo simplemente redondea a la centésima más cercana (más grande).

function roundNumber(rnum, rlength) { 
    var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

alert(roundNumber(678.91011,2)); // returns 678.91

function ceilNumber(rnum, rlength) { 
    var newnumber = Math.ceil(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
    return newnumber;
}

alert(ceilNumber(678.91011,2)); // returns 678.92

avatar de usuario de zhulien
zhulien

ok, esto ha sido respondido, pero pensé que te gustaría ver mi respuesta que llama al math.pow() funcionar una vez. Supongo que me gusta mantener las cosas SECA.

function roundIt(num, precision) {
    var rounder = Math.pow(10, precision);
    return (Math.round(num * rounder) / rounder).toFixed(precision)
};

De alguna manera lo pone todo junto. Reemplazar Math.round() con Math.ceil() para redondear en lugar de redondear, que es lo que quería el OP.

Avatar de usuario de Behnam
Behnam

esta función limita decimal sin número redondo

function limitDecimal(num,decimal){
     return num.toString().substring(0, num.toString().indexOf('.')) + (num.toString().substr(num.toString().indexOf('.'), decimal+1));
}

  • Como alternativa más corta: return ( ” + num ).split(‘.’).shift()

    – Yogui

    27 de noviembre de 2015 a las 20:49

  • gracias Roberto este código funciona, pero elimina todos los decimales

    – Behnam

    29 de noviembre de 2015 a las 7:31

¿Ha sido útil esta solución?