HOWTO · JavaScript

Redondear un número a 2 decimales en JavaScript

Este tutorial enseña cómo redondear un número como máximo a `2` lugares decimales en JavaScript.

En esta página

Usa toFixed(2) cuando necesites texto que siempre muestre dos cifras después del separador decimal. Devuelve una cadena, por lo que los ceros finales permanecen visibles. Si necesitas un resultado numérico, usa Math.round(value * 100) / 100 o convierte la cadena formateada con Number(). Estos métodos son prácticos para valores habituales, pero JavaScript almacena los números en coma flotante binaria; por eso, entradas decimales como 1.005 pueden no redondearse como esperas.

Dar formato a un número con toFixed()

Llama a toFixed(2) en un número para obtener una cadena con dos cifras decimales. Resulta útil para una etiqueta, una celda de tabla u otra presentación en la que 5.60 deba conservar el cero final. Sin embargo, el valor devuelto es texto; para hacer operaciones aritméticas con él, primero tienes que volver a convertirlo en número.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

const value = 5.6789;
const fixedText = value.toFixed(2);
const roundedValue = Math.round(value * 100) / 100;
const numericValue = Number(value.toFixed(2));

function roundToTwo(number) {
  const shifted = Number(`${number}e2`);
  return Number(`${Math.round(shifted)}e-2`);
}

const shiftedValue = roundToTwo(value);
console.log(fixedText, roundedValue, numericValue, shiftedValue);
5.68 5.68 5.68 5.68

En este orden, los valores son la cadena de toFixed(), el número de Math.round(), la conversión con Number() y el resultado de la función auxiliar que desplaza los decimales. Solo el primer valor es texto; al convertirlo con Number() se obtiene un número y se pierden los ceros finales.

Redondear un número con Math.round()

Multiplicar por 100 desplaza las centésimas a la posición de las unidades. Math.round() redondea ese valor escalado a un entero y dividirlo entre 100 restablece la escala decimal. El resultado sigue siendo un número, lo que facilita las operaciones posteriores, pero no indica cuántas cifras decimales deben mostrarse.

Math.round() resuelve los valores exactamente intermedios hacia el infinito positivo. Por ejemplo, un empate en -1.5 se redondea a -1, así que los valores negativos no siguen una regla que siempre redondee alejándose de cero. Además, la multiplicación también usa aritmética de coma flotante; este patrón es conciso, pero no garantiza un redondeo decimal exacto para todas las entradas.

Entender los casos límite de la coma flotante

El tipo Number de JavaScript representa los valores mediante coma flotante binaria. Muchas fracciones decimales no pueden representarse exactamente en binario, y las operaciones intermedias pueden quedar ligeramente por debajo o por encima del valor decimal que se pretendía. Un caso conocido es 1.005: el valor almacenado es ligeramente inferior a esa fracción decimal, por lo que 1.005.toFixed(2) puede producir "1.00"; escalar el valor antes de aplicar Math.round() también puede dar un resultado inesperado.

Number.EPSILON es la distancia entre 1 y el siguiente número representable. Sumarlo antes de redondear puede ayudar con algunas entradas cercanas a 1, pero la distancia entre números representables cambia según la magnitud. Por tanto, un ajuste fijo con epsilon no corrige todos los valores ni todos los historiales de operaciones.

toPrecision() controla las cifras significativas, no el número de cifras después del separador decimal. Por ejemplo, Number((1.23456).toPrecision(4)).toFixed(2) produce "1.24", mientras que (1.23456).toFixed(2) produce "1.23": la primera operación redondea a 1.235 y la segunda vuelve a redondear ese valor intermedio. Este es un caso concreto de doble redondeo, no una corrección de propósito general; el primer paso de formato puede descartar información necesaria para el siguiente.

Usar una función auxiliar para desplazar los decimales

La función auxiliar anterior desplaza la escala decimal mediante la notación exponencial, redondea el valor desplazado y luego devuelve la escala a su posición original. Esto puede evitar algunas sorpresas causadas por multiplicar directamente una fracción decimal por 100, y aun así devuelve un número. Si vas a redondear a otra cantidad de cifras, adapta el exponente: usa esa cantidad para el desplazamiento inicial y su negativo para el desplazamiento de vuelta.

Considera esta función una opción práctica para valores finitos habituales, no una biblioteca de aritmética decimal. La representación de coma flotante sigue aplicándose, y las magnitudes extremas o los valores especiales pueden requerir un tratamiento aparte. Si necesitas un comportamiento decimal exacto para operaciones monetarias o contables, usa unidades menores enteras cuando el dominio lo permita, o una biblioteca de aritmética decimal con reglas adecuadas para la aplicación. Dar formato a un resultado para mostrarlo y realizar cálculos decimales exactos son necesidades distintas.

Elegir el método adecuado

Elige toFixed(2) cuando necesites texto con un número fijo de cifras decimales; conserva los ceros finales y devuelve una cadena. Elige Math.round(value * 100) / 100 cuando te convenga obtener un resultado numérico compacto y el intervalo de entrada sea adecuado para la aritmética de coma flotante habitual. Elige Number(value.toFixed(2)) si quieres aplicar el redondeo de toFixed() y después obtener un valor numérico, teniendo en cuenta que los números no conservan el formato de presentación. También puedes considerar la función auxiliar que desplaza los decimales, siempre que tengas presentes sus limitaciones.

Ninguno de estos métodos convierte los números de JavaScript en cantidades decimales exactas. En interfaces, aplica el formato al presentar el valor. Para cálculos con reglas decimales estrictas, define explícitamente la política de redondeo y la representación numérica; después, prueba valores representativos del dominio de la aplicación.