¿Cómo se redondea a un lugar decimal en JavaScript?

4 minutos de lectura

Avatar de usuario de Walker
Caminante

¿Puede redondear un número en JavaScript a un carácter después del punto decimal (redondeado correctamente)?

Probé el *10, round, /10, pero deja dos decimales al final del int.

Avatar de usuario de Billy Moon
billy luna

Math.round(num * 10) / 10 funciona, y aquí hay un ejemplo…

var number = 12.3456789
var rounded = Math.round(number * 10) / 10
// rounded is 12.3

Si desea que tenga un lugar decimal, incluso cuando sería un 0, entonces agregue…

var fixed = rounded.toFixed(1)
// 'fixed' is always to one decimal point
// NOTE: .toFixed() returns a string!

// To convert back to number format
parseFloat(number.toFixed(2))
// 12.34
// but that will not retain any trailing zeros

// So, just make sure it is the last step before output,
// and use a number format during calculations!

Usando este principio, como referencia, aquí hay una función pequeña y práctica que requiere precisión…

function round(value, precision) {
    var multiplier = Math.pow(10, precision || 0);
    return Math.round(value * multiplier) / multiplier;
}

… uso …

round(12345.6789, 2) // 12345.68
round(12345.6789, 1) // 12345.7

… por defecto redondea al número entero más cercano (precisión 0) …

round(12345.6789) // 12346

… y se puede usar para redondear al 10 o 100 más cercano, etc…

round(12345.6789, -1) // 12350
round(12345.6789, -2) // 12300

… y el manejo correcto de números negativos …

round(-123.45, 1) // -123.4
round(123.45, 1) // 123.5

… y se puede combinar con toFixed para formatear consistentemente como una cadena …

round(456.7, 2).toFixed(2) // "456.70"

  • Tenga cuidado al usar .toFixed() ya que devuelve una cadena cuando tal vez quieras un número.

    – Cobby

    14 de septiembre de 2012 a las 5:25


  • Genial, obviamente usando parseFloat eliminará los decimales dejados por .toFixed() si es un número entero (ceros). En general, si desea hacer los cálculos, es mejor seguir su primer ejemplo. Si desea mostrar un número en su interfaz de usuario, utilice .toFixed().

    – Cobby

    17 de septiembre de 2012 a las 1:12

  • Hmmm… eso tiene sentido, cualquier forma de convertir a número siempre debe eliminar los ceros erróneos, por lo que tiene que permanecer como una cadena. Supongo que siempre debe ser el último paso antes de la visualización y no debe usarse en los cálculos.

    –Billy Luna

    17 de septiembre de 2012 a las 10:22

  • Tenga cuidado al usar .toFixed() ya que podría devolver diferentes resultados de redondeo para diferentes navegadores. Leer esta publicación para detalles sobre el tema!

    – Marchitez

    4 de marzo de 2014 a las 13:02


  • ¿Puedo agregar un cero si no hay DP presentes?

    – Nick

    24 de noviembre de 2016 a las 12:34

var number = 123.456;

console.log(number.toFixed(1)); // should round to 123.5

  • A veces toFixed() tiene fallas: lo he visto en un navegador Chrome donde llamo toFixed()luego convertir a una cadena, y muestra algo como 10.00000000068 – extraño. Sin embargo, no se puede reproducir esto de manera confiable.

    – Hamish Grubijan

    25/04/2013 a las 21:45


  • Sí, contabilicé fallas con toFixed() incluso con solo unos pocos decimales. Redondeó la fracción 4 al siguiente número más alto en lugar de más bajo, si no recuerdo mal.

    – Dalibor

    30 de junio de 2015 a las 7:43

  • como lo menciona @cobby arriba: tenga cuidado al usar .toFixed() como devuelve un String cuando tal vez quieras un Number

    – ricardo

    25 de mayo de 2019 a las 0:41


Avatar de usuario de Jasper de Vries
jaspe de vries

Si utiliza Math.round(5.01) conseguirás 5 en lugar de 5.0.

Si utiliza toFixed te encuentras con problemas de redondeo.

Si quieres lo mejor de ambos mundos, combina los dos:

(Math.round(5.01 * 10) / 10).toFixed(1)

Es posible que desee crear una función para esto:

function roundedToFixed(input, digits){
  var rounder = Math.pow(10, digits);
  return (Math.round(input * rounder) / rounder).toFixed(digits);
}

Avatar de usuario de Kevinleary.net
Kevinleary.net

Lodash tiene un round método:

_.round(4.006);
// => 4

_.round(4.006, 2);
// => 4.01

_.round(4060, -2);
// => 4100

Documentación.

Fuente.

Avatar de usuario de Rusty
Oxidado

Simplemente puede hacer lo siguiente:

let n = 1.25
let result = Number(n).toFixed(1)
// output string: 1.3

Avatar de usuario de Peter Mortensen
Pedro Mortensen

yo voto por toFixed(), pero, para que conste, aquí hay otra forma que usa el cambio de bits para convertir el número en un int. Por lo tanto, siempre se redondea hacia cero (hacia abajo para números positivos, hacia arriba para negativos).

var rounded = ((num * 10) << 0) * 0.1;

Pero bueno, dado que no hay llamadas de función, es increíblemente rápido. 🙂

Y aquí hay uno que usa coincidencia de cadenas:

var rounded = (num + '').replace(/(^.*?\d+)(\.\d)?.*/, '$1$2');

No recomiendo usar la variante de cadena, solo digo.

Avatar de usuario de Peter Mortensen
Pedro Mortensen

Prueba con esto:

var original = 28.453

// 1.- round "original" to two decimals
var result = Math.round (original * 100) / 100  // Returns 28.45

// 2.- round "original" to 1 decimal
var result = Math.round (original * 10) / 10  // Returns 28.5

// 3.- round 8.111111 to 3 decimals
var result = Math.round (8.111111 * 1000) / 1000  // Returns 8.111

Es menos complicado y más fácil de implementar…

Con esto, puedes crear una función para hacer:

function RoundAndFix (n, d) {
    var m = Math.pow (10, d);
    return Math.round (n * m) / m;
}
function RoundAndFix (n, d) {
    var m = Math.pow (10, d);
    return Math.round (n * m) / m;
}
console.log (RoundAndFix(8.111111, 3));

Ver Cómo redondear usando ROUND HALF UP. Modo de redondeo que a la mayoría de nosotros nos enseñaron en la escuela primaria.

  • No: RoundAndFix(1.005, 2) .

    – No yo

    4 de diciembre de 2014 a las 17:56

  • Puede requerir Ctrl + Shift + J para mostrar el resultado (y permitir JavaScript desde stacksnippets.net)

    -Peter Mortensen

    19 abr a las 10:00


¿Ha sido útil esta solución?