CEIL / CEILING
La función CEIL (o su alias CEILING) devuelve el entero más pequeño que es mayor o igual al número dado. Dicho de forma más sencilla: redondea hacia arriba, siempre. No importa si el decimal es 0.1 o 0.9, CEIL siempre sube al siguiente entero.
El nombre viene de "ceiling" (techo en inglés), una buena forma de recordarlo: el techo siempre está arriba. Es la función opuesta a FLOOR (suelo), que siempre redondea hacia abajo.
CEIL y CEILING son exactamente la misma función. CEIL es simplemente la forma abreviada que la mayoría de programadores prefiere por comodidad. Puedes usar cualquiera de las dos indistintamente.
Sintaxis
CEIL(numero)
-- o su alias completo
CEILING(numero)La función recibe un único argumento numérico y devuelve un entero. El argumento puede ser un valor literal, una columna, una expresión matemática o el resultado de otra función. Si el argumento es NULL, el resultado también será NULL.
Comportamiento básico
Para entender bien CEIL, hay que distinguir entre números positivos y negativos, porque el comportamiento con negativos suele causar confusión.
Con números positivos
Con números positivos, CEIL siempre redondea al entero superior. Esto significa que cualquier parte decimal, por pequeña que sea, hace que el resultado suba al siguiente entero:
SELECT CEIL(4.1) AS resultado;| resultado |
|---|
| 5 |
Aunque 4.1 está mucho más cerca de 4 que de 5, CEIL devuelve 5 porque su trabajo no es buscar el entero más cercano (eso lo hace ROUND), sino buscar el entero que está "por encima".
Veamos más ejemplos para que quede claro el patrón:
SELECT
CEIL(4.001) AS minimo_decimal,
CEIL(4.5) AS medio,
CEIL(4.999) AS casi_cinco,
CEIL(5.0) AS ya_entero;| minimo_decimal | medio | casi_cinco | ya_entero |
|---|---|---|---|
| 5 | 5 | 5 | 5 |
Observa que 4.001, 4.5 y 4.999 dan exactamente el mismo resultado: 5. Esto es porque CEIL no se fija en cuánto decimal hay, solo en si hay alguno. La única excepción es cuando el número ya es entero (como 5.0), en cuyo caso se devuelve tal cual porque ya cumple la condición de ser "mayor o igual".
Con números negativos
Con números negativos, CEIL redondea hacia cero. Esto suele confundir a quienes lo usan por primera vez, pero tiene todo el sentido si piensas en la recta numérica:
SELECT CEIL(-4.1) AS resultado;| resultado |
|---|
| -4 |
¿Por qué -4 y no -5? Porque en la recta numérica, -4 está a la derecha de -4.1, es decir, está "más arriba". Recuerda que CEIL busca el entero más pequeño que sea mayor o igual al número dado. -4 es mayor que -4.1, así que es la respuesta correcta.
Veamos la comparación completa:
SELECT CEIL(-4.1) AS a, CEIL(-4.5) AS b, CEIL(-4.9) AS c, CEIL(-5.0) AS d;| a | b | c | d |
|---|---|---|---|
| -4 | -4 | -4 | -5 |
De nuevo, -4.1, -4.5 y -4.9 dan el mismo resultado (-4) porque todos están entre -5 y -4, y el "techo" es -4. Solo -5.0 da -5 porque ya es un entero exacto.
Resumen visual
Para números positivos, CEIL se aleja de cero. Para negativos, se acerca a cero. En ambos casos, va "hacia arriba" en la recta numérica:
... -5 -4 -3 -2 -1 0 1 2 3 4 5 ...
← CEIL(-4.3) = -4
CEIL(4.3) = 5 →
Caso práctico: calcular páginas de paginación
Este es probablemente el uso más frecuente de CEIL en el mundo real. Prácticamente todas las aplicaciones web que muestran listas de datos necesitan paginación, y CEIL es la función perfecta para calcular cuántas páginas se necesitan.
El problema es simple: si tienes 23 productos y quieres mostrar 10 por página, ¿cuántas páginas necesitas? Si divides 23 entre 10 obtienes 2.3. No puedes tener 2.3 páginas, así que necesitas 3: dos páginas completas con 10 productos cada una, y una tercera página con los 3 productos restantes.
Eso es exactamente lo que hace CEIL: sube 2.3 a 3.
SELECT
COUNT(*) AS total_productos,
10 AS por_pagina,
CEIL(COUNT(*) / 10) AS total_paginas
FROM productos;| total_productos | por_pagina | total_paginas |
|---|---|---|
| 20 | 10 | 2 |
En este caso con 20 productos, la división es exacta (20/10 = 2.0) y CEIL devuelve 2. Pero si hubiera 21 productos, CEIL(21/10) = CEIL(2.1) = 3.
Sin CEIL, tendrías que usar lógica condicional mucho más complicada para manejar los casos donde la división no es exacta. Este patrón es tan universal que vale la pena memorizarlo:
-- Fórmula general de paginación
CEIL(total_elementos / elementos_por_pagina) AS total_paginasPuedes usar esta misma fórmula en cualquier lenguaje de programación. En PHP sería ceil($total / $porPagina), en JavaScript Math.ceil(total / porPagina), en Python math.ceil(total / por_pagina). La lógica es siempre la misma.
Caso práctico: calcular unidades de empaquetado
Otro escenario muy habitual es calcular cuántas cajas, pallets, camiones o cualquier contenedor necesitas para transportar o almacenar una cierta cantidad de productos. La lógica es idéntica a la paginación: si cada caja tiene capacidad para 12 unidades y tienes 30, necesitas 3 cajas (2 llenas + 1 parcialmente llena con 6 unidades).
SELECT
nombre,
stock,
12 AS unidades_por_caja,
CEIL(stock / 12) AS cajas_necesarias
FROM productos
LIMIT 5;| nombre | stock | unidades_por_caja | cajas_necesarias |
|---|---|---|---|
| iPhone 15 Pro | 50 | 12 | 5 |
| MacBook Air M2 | 30 | 12 | 3 |
| AirPods Pro | 100 | 12 | 9 |
| iPad Air | 25 | 12 | 3 |
| Apple Watch Series 9 | 45 | 12 | 4 |
¿Por qué CEIL y no ROUND? Porque si tienes 25 unidades y cada caja cabe 12, ROUND(25/12) = ROUND(2.08) = 2 cajas, y te quedaría un producto sin caja. Con CEIL(25/12) = CEIL(2.08) = 3, siempre tienes suficientes cajas. Es mejor tener una caja parcialmente vacía que un producto sin empaquetar.
Esto aplica a cualquier problema de "cuántos contenedores necesito": turnos de trabajo, viajes de camión, filas de asientos, etc.
Caso práctico: redondear precios hacia arriba
En comercio y finanzas, a veces necesitas redondear precios hacia arriba después de aplicar impuestos o comisiones. Si el IVA del 21% convierte un precio de 249.99 en 302.49, podrías querer cobrar 303 para evitar céntimos:
SELECT
nombre,
precio,
ROUND(precio * 1.21, 2) AS con_iva_exacto,
CEIL(precio * 1.21) AS con_iva_redondeado
FROM productos
LIMIT 5;| nombre | precio | con_iva_exacto | con_iva_redondeado |
|---|---|---|---|
| iPhone 15 Pro | 1299.99 | 1572.99 | 1573 |
| MacBook Air M2 | 1199.99 | 1451.99 | 1452 |
| AirPods Pro | 249.99 | 302.49 | 303 |
| iPad Air | 599.99 | 725.99 | 726 |
| Apple Watch Series 9 | 399.99 | 483.99 | 484 |
Por supuesto, debes tener cuidado con las implicaciones legales y contables de redondear precios. En muchos países, el IVA debe calcularse con precisión de céntimos. Pero para precios internos, estimaciones, o precios psicológicos (sin decimales), CEIL es muy útil.
Caso práctico: distribuir trabajo equitativamente
Imagina que tienes 100 tickets de soporte y 7 agentes disponibles. ¿Cuántos tickets debe resolver cada agente como máximo? Si haces la división 100/7 = 14.28, la respuesta es 15: cada agente recibe como máximo 15 tickets, y algunos recibirán solo 14.
SELECT
100 AS total_tickets,
7 AS agentes,
CEIL(100 / 7) AS tickets_por_agente;| total_tickets | agentes | tickets_por_agente |
|---|---|---|
| 100 | 7 | 15 |
Con 15 tickets máximo por agente, 7 agentes pueden manejar hasta 105 tickets (7 × 15), así que 100 tickets caben perfectamente. Algunos agentes tendrán 15 y otros 14, pero nadie tendrá más de 15.
Si hubieras usado FLOOR(100/7) = 14, 7 agentes × 14 tickets = 98 tickets, y te sobrarían 2 sin asignar.
CEIL vs FLOOR vs ROUND: cuándo usar cada una
Estas tres funciones de redondeo son las más usadas en MySQL y es fundamental entender cuándo elegir cada una, porque usar la incorrecta puede causar errores sutiles pero importantes en tu aplicación.
La diferencia clave
- CEIL siempre sube: 4.1 → 5, 4.5 → 5, 4.9 → 5
- FLOOR siempre baja: 4.1 → 4, 4.5 → 4, 4.9 → 4
- ROUND busca el más cercano: 4.1 → 4, 4.5 → 5, 4.9 → 5
La gran diferencia es que CEIL y FLOOR son deterministas en su dirección: sin importar el valor decimal, siempre van hacia arriba o hacia abajo respectivamente. ROUND, en cambio, puede ir en cualquier dirección dependiendo de si el decimal es mayor o menor que .5.
SELECT
CEIL(4.3) AS ceil_val,
FLOOR(4.3) AS floor_val,
ROUND(4.3) AS round_val;| ceil_val | floor_val | round_val |
|---|---|---|
| 5 | 4 | 4 |
SELECT
CEIL(4.7) AS ceil_val,
FLOOR(4.7) AS floor_val,
ROUND(4.7) AS round_val;| ceil_val | floor_val | round_val |
|---|---|---|
| 5 | 4 | 5 |
Guía de decisión
La forma más fácil de elegir entre las tres es preguntarte: "¿qué pasa si me quedo corto?"
| Función | Dirección | Cuándo usarla | Ejemplo |
|---|---|---|---|
CEIL | Siempre arriba | Cuando quedarte corto es inaceptable | Páginas, cajas, turnos: necesitas "al menos N" |
FLOOR | Siempre abajo | Cuando pasarte es inaceptable | Años completos, lotes llenos, unidades enteras vendidas |
ROUND | Al más cercano | Cuando quieres la mejor aproximación | Promedios, estadísticas, reportes |
Si necesitas 3 cajas para 25 productos, tener solo 2 cajas es un problema. Usa CEIL.
Si un usuario tiene 11 meses registrado, decir que lleva "1 año" sería incorrecto. Usa FLOOR.
Si el precio medio es 4.3, tanto 4 como 5 son aproximaciones válidas. Usa ROUND.
CEIL con NULL
Como la mayoría de funciones en MySQL, CEIL devuelve NULL si recibe NULL como argumento. No produce error, simplemente propaga el valor nulo:
SELECT CEIL(NULL) AS resultado;| resultado |
|---|
| NULL |
Si trabajas con columnas que pueden contener NULL, usa IFNULL o COALESCE para manejar ese caso antes de aplicar CEIL:
SELECT CEIL(IFNULL(precio, 0)) AS precio_redondeado
FROM productos;En el siguiente artículo veremos FLOOR para redondear hacia abajo.
Escrito por Eduardo Lázaro
