Command Palette

Search for a command to run...

Redondeo en JavaScript: round(), floor(), ceil() y trunc()

Domina los métodos de redondeo de JavaScript para controlar con precisión la parte decimal de números en tus aplicaciones.

Lectura: 12 min
Nivel: Principiante

TL;DR - Resumen rápido

  • Math.round() usa 'round half up': 4.5→5, -4.5→-4 (hacia +∞ en empates)
  • Math.floor() siempre hacia abajo: 4.9→4, -4.1→-5 (hacia -∞)
  • Math.ceil() siempre hacia arriba: 4.1→5, -4.9→-4 (hacia +∞)
  • Math.trunc() elimina decimales sin redondear: 4.9→4, -4.9→-4 (hacia 0)
  • Para 2 decimales: Math.round(num * 100) / 100 (ojo con precisión flotante)

Introducción al Redondeo

El redondeo de números es una operación fundamental en programación que permite controlar la precisión de valores numéricos. JavaScript proporciona cuatro métodos principales en el objeto Math: round(), floor(), ceil() y trunc(). Cada método tiene un comportamiento específico que se adapta a diferentes casos de uso, desde cálculos financieros hasta algoritmos de paginación y división de arrays.

Entender las diferencias entre estos métodos es crucial porque un error en el redondeo puede causar bugs sutiles, especialmente en aplicaciones que manejan dinero, estadísticas o cualquier cálculo donde la precisión es importante. Los métodos de redondeo también se comportan de manera diferente con números negativos, lo que requiere atención especial.

  • Todos los métodos retornan números enteros (sin decimales)
  • Los métodos no modifican el valor original, retornan un nuevo valor
  • Math.round() usa 'round half up' (0.5→1, -0.5→0), NO redondeo bancario
  • Los métodos trabajan correctamente con números negativos pero con comportamientos distintos
  • Para redondear a decimales específicos, combina con multiplicación/división

Historia de los Métodos de Redondeo

Math.round(), Math.floor() y Math.ceil() existen desde ES1 (ECMAScript 1997). Math.trunc() fue añadido más tarde en ES6 (2015) para proporcionar una forma explícita de eliminar la parte decimal sin redondeo. Antes de ES6, los desarrolladores usaban trucos como Math.floor(Math.abs(x)) * Math.sign(x) para lograr el mismo efecto.

Math.round(): Redondeo al Entero Más Cercano

Math.round() redondea un número al entero más cercano. Si la parte decimal es exactamente 0.5, el número se redondea hacia el siguiente entero positivo (hacia el infinito positivo). Este es el método de redondeo más común y el que la mayoría de las personas esperan cuando hablan de "redondear".

Sintaxis Básica de round()

Math.round() acepta un único argumento numérico y retorna el entero más cercano. El comportamiento es consistente tanto para números positivos como negativos, aunque la dirección del redondeo cuando la parte decimal es exactamente 0.5 siempre es hacia el infinito positivo.

round-basico.js
Loading code...

El ejemplo muestra cómo Math.round() se comporta con diferentes valores. Nota que 4.5 se redondea a 5 y -4.5 se redondea a -4, no a -5. Esto es porque el redondeo siempre va hacia el infinito positivo cuando la parte decimal es exactamente 0.5.

Redondear a Decimales Específicos

Math.round() solo redondea a enteros, pero puedes redondear a un número específico de decimales usando una combinación de multiplicación y división. Esta técnica es útil para cálculos financieros donde necesitas precisión de centavos o milésimas.

round-decimales.js
Loading code...

Esta técnica multiplica por 10^n, redondea al entero más cercano, y luego divide por 10^n. Es importante notar que este método puede tener problemas de precisión de punto flotante con ciertos valores, especialmente en cálculos financieros críticos.

Advertencia de Precisión en Cálculos Financieros

Para cálculos financieros que requieren precisión exacta, evita usar métodos de redondeo de punto flotante. Considera usar bibliotecas especializadas como decimal.js o trabajar con centavos como enteros (multiplicando por 100) para evitar errores de precisión de punto flotante.

Math.floor(): Redondeo Hacia Abajo

Math.floor() siempre redondea un número hacia abajo al entero más cercano que es menor o igual al valor original. Este método es especialmente útil cuando necesitas calcular índices de arrays, divisiones de páginas o cualquier situación donde necesitas garantizar que el resultado no exceda un límite superior.

Sintaxis Básica de floor()

Math.floor() es predecible y consistente: siempre devuelve el entero más cercano que es menor o igual al número de entrada. Esto lo hace ideal para cálculos donde necesitas un límite superior garantizado, independientemente de si el número es positivo o negativo.

floor-basico.js
Loading code...

El ejemplo demuestra el comportamiento consistente de Math.floor(). Note que -4.5 se redondea a -5, que es menor que -4.5. Esto es diferente de Math.round(), donde -4.5 se redondea a -4.

Casos de Uso Prácticos de floor()

Math.floor() es comúnmente utilizado para calcular índices de arrays, determinar el número de páginas completas en una paginación, y en algoritmos que requieren división entera sin residuos. Su comportamiento predecible lo hace ideal para estas situaciones.

floor-usos.js
Loading code...

Estos ejemplos muestran aplicaciones prácticas de Math.floor() en situaciones comunes de programación. El cálculo de índices de array y la paginación son casos donde floor() es esencial para evitar errores de índice fuera de rango.

División Entera con floor()

En JavaScript no existe un operador de división entera como en otros lenguajes. Math.floor(a / b) es el equivalente más cercano. Sin embargo, ten cuidado con números negativos: Math.floor(-7 / 3) = -3, mientras que en algunos lenguajes la división entera daría -2.

Math.ceil(): Redondeo Hacia Arriba

Math.ceil() siempre redondea un número hacia arriba al entero más cercano que es mayor o igual al valor original. Este método es el opuesto de Math.floor() y es útil cuando necesitas garantizar un mínimo o calcular cuántos elementos completos necesitas para cubrir una cantidad.

Sintaxis Básica de ceil()

Math.ceil() es consistente en su comportamiento: siempre devuelve el entero más cercano que es mayor o igual al número de entrada. Esto lo hace ideal para cálculos donde necesitas un límite inferior garantizado, como calcular el número mínimo de contenedores necesarios.

ceil-basico.js
Loading code...

El ejemplo muestra cómo Math.ceil() se comporta con diferentes valores. Note que -4.5 se redondea a -4, que es mayor que -4.5. Esto es el comportamiento opuesto de Math.floor(), donde -4.5 se redondea a -5.

Casos de Uso Prácticos de ceil()

Math.ceil() es útil para calcular el número mínimo de elementos necesarios, determinar cuántas páginas se requieren para mostrar todos los resultados, o calcular el número mínimo de iteraciones necesarias en un bucle.

ceil-usos.js
Loading code...

Estos ejemplos demuestran situaciones donde Math.ceil() es esencial. El cálculo de contenedores necesarios y el número de páginas son casos típicos donde necesitas redondear hacia arriba para garantizar que tengas suficiente capacidad.

Math.trunc(): Eliminar Parte Decimal

Math.trunc() elimina la parte decimal de un número sin redondear, simplemente retorna la parte entera. Este método es diferente de round(), floor() y ceil() porque no realiza ningún redondeo: simplemente "corta" o trunca la parte decimal.

Sintaxis Básica de trunc()

Math.trunc() es el método más directo para obtener la parte entera de un número. Para números positivos, se comporta igual que Math.floor(), pero para números negativos se comporta igual que Math.ceil(), porque simplemente elimina la parte decimal sin considerar su valor.

trunc-basico.js
Loading code...

El ejemplo muestra cómo Math.trunc() simplemente elimina la parte decimal. Note que tanto 4.9 como -4.9 se convierten en 4 y -4 respectivamente, sin importar cuán grande sea la parte decimal.

trunc() vs floor() con Números Negativos

La diferencia entre Math.trunc() y Math.floor() es más evidente con números negativos. Math.trunc() simplemente elimina la parte decimal, mientras que Math.floor() siempre redondea hacia abajo (a un número más negativo).

trunc-vs-floor.js
Loading code...

Este ejemplo ilustra claramente la diferencia entre ambos métodos con números negativos. Math.trunc(-4.7) = -4 mientras que Math.floor(-4.7) = -5. La diferencia es de 1, pero puede ser significativa en ciertos algoritmos.

Compatibilidad con Navegadores Antiguos

Math.trunc() fue introducido en ES6 (2015). Para navegadores muy antiguos que no soportan ES6, puedes usar Math.sign(x) * Math.floor(Math.abs(x)) como polyfill. Sin embargo, en el desarrollo moderno, Math.trunc() tiene soporte universal en todos los navegadores actuales.

Comparación de Métodos de Redondeo

Entender las diferencias entre los cuatro métodos de redondeo es esencial para elegir el correcto para cada situación. La siguiente comparación muestra cómo cada método se comporta con el mismo conjunto de valores.

comparacion-redondeo.js
Loading code...

Esta tabla comparativa muestra claramente las diferencias entre los cuatro métodos. Math.round() es el único que considera el valor de la parte decimal para decidir la dirección del redondeo. Math.floor() siempre va hacia abajo, Math.ceil() siempre va hacia arriba, y Math.trunc() simplemente elimina la parte decimal.

  • Usa <strong>Math.round()</strong> para redondeo estándar al entero más cercano
  • Usa <strong>Math.floor()</strong> para límites superiores garantizados (índices, paginación)
  • Usa <strong>Math.ceil()</strong> para límites inferiores garantizados (contenedores, iteraciones)
  • Usa <strong>Math.trunc()</strong> para simplemente eliminar decimales sin redondear

Resumen: Métodos de Redondeo en JavaScript

Conceptos principales:

  • Math.round() redondea al entero más cercano (.5 hacia el infinito positivo)
  • Math.floor() siempre redondea hacia abajo (menor o igual al valor)
  • Math.ceil() siempre redondea hacia arriba (mayor o igual al valor)
  • Math.trunc() elimina la parte decimal sin realizar redondeo
  • El comportamiento con números negativos varía según el método usado

Mejores prácticas:

  • Usa Math.floor() para calcular índices de arrays y evitar errores de rango
  • Usa Math.ceil() para calcular el número mínimo de elementos necesarios
  • Usa Math.trunc() cuando necesites solo la parte entera sin redondeo
  • Para cálculos financieros críticos, considera bibliotecas de precisión arbitraria
  • Combina con multiplicación/división para redondear a decimales específicos