FLOOR
La función FLOOR devuelve el entero más grande que es menor o igual al número dado. En otras palabras, redondea siempre hacia abajo. Si el número tiene cualquier parte decimal, FLOOR la elimina y devuelve el entero inferior.
El nombre viene de "floor" (suelo en inglés), el opuesto de CEIL (techo). El suelo siempre está abajo, igual que FLOOR siempre redondea hacia abajo. Es una forma fácil de recordarlo.
Sintaxis
FLOOR(numero)La función recibe un único argumento numérico y devuelve un entero. A diferencia de CEIL, que tiene un alias (CEILING), FLOOR no tiene alias alternativos.
Comportamiento básico
Con números positivos
Con números positivos, FLOOR simplemente elimina la parte decimal:
SELECT FLOOR(4.9) AS resultado;| resultado |
|---|
| 4 |
Aunque 4.9 está mucho más cerca de 5 que de 4, FLOOR devuelve 4. Su trabajo no es buscar el entero más cercano (eso es ROUND), sino el entero que está "por debajo".
SELECT FLOOR(4.1) AS bajo, FLOOR(4.5) AS medio, FLOOR(4.999) AS alto, FLOOR(5.0) AS exacto;| bajo | medio | alto | exacto |
|---|---|---|---|
| 4 | 4 | 4 | 5 |
Al igual que con CEIL, no importa el valor del decimal: 4.1, 4.5 y 4.999 todos dan 4. Solo cuando el número ya es entero (5.0), se devuelve tal cual.
Con números negativos
Aquí es donde FLOOR sorprende a muchos. Con números negativos, FLOOR redondea alejándose de cero, lo que a primera vista parece "hacia abajo" en un sentido diferente al esperado:
SELECT FLOOR(-4.1) AS resultado;| resultado |
|---|
| -5 |
¿Por qué -5 y no -4? Porque -5 es menor que -4.1 en la recta numérica (está más a la izquierda). FLOOR busca el entero más grande que sea menor o igual al número dado. -5 cumple esa condición (-5 ≤ -4.1), mientras que -4 no (-4 > -4.1).
Esto es exactamente lo opuesto a CEIL, que con -4.1 devuelve -4 (hacia cero). FLOOR con -4.1 devuelve -5 (alejándose de cero).
SELECT FLOOR(-4.1) AS a, FLOOR(-4.5) AS b, FLOOR(-4.9) AS c, FLOOR(-5.0) AS d;| a | b | c | d |
|---|---|---|---|
| -5 | -5 | -5 | -5 |
Todos dan -5 porque todos están entre -5 y -4, y el "suelo" es -5.
FLOOR vs simplemente "eliminar decimales"
Es crucial entender que FLOOR no es lo mismo que truncar los decimales. Con números positivos sí coinciden, pero con negativos no:
SELECT
FLOOR(-4.7) AS floor_val,
TRUNCATE(-4.7, 0) AS truncate_val;| floor_val | truncate_val |
|---|---|
| -5 | -4 |
TRUNCATE simplemente corta los decimales (de -4.7 queda -4). FLOOR busca el entero inferior (-5 es menor que -4.7). Esta diferencia es sutil pero puede causar bugs difíciles de detectar si confundes las dos funciones.
Caso práctico: calcular años completos
Uno de los usos más frecuentes de FLOOR es calcular unidades completas transcurridas. Por ejemplo, si un cliente se registró hace 400 días, ¿cuántos años completos lleva registrado?
400 días / 365 = 1.096 años. No puedes decir que lleva 2 años (sería incorrecto), ni que lleva 1.096 años (no es natural). Lo correcto es decir que lleva 1 año completo. Eso es exactamente FLOOR(1.096) = 1.
SELECT
nombre,
fecha_registro,
DATEDIFF(NOW(), fecha_registro) AS dias,
FLOOR(DATEDIFF(NOW(), fecha_registro) / 365) AS anos_completos
FROM clientes
LIMIT 5;¿Por qué FLOOR y no ROUND? Porque si alguien lleva 11 meses registrado (0.9 años), ROUND diría "1 año" y estaría mintiendo. FLOOR dice correctamente "0 años completos". FLOOR es la función correcta siempre que necesites contar unidades completadas, no aproximadas.
Caso práctico: agrupar precios en rangos
FLOOR es perfecto para crear rangos o "buckets" de valores numéricos. Si divides un precio entre 100 y aplicas FLOOR, obtienes el rango de centenas al que pertenece:
SELECT
FLOOR(precio / 100) * 100 AS rango_desde,
FLOOR(precio / 100) * 100 + 99 AS rango_hasta,
COUNT(*) AS total_productos
FROM productos
GROUP BY FLOOR(precio / 100)
ORDER BY rango_desde;Un producto de 249.99 se calcula como FLOOR(249.99/100) = FLOOR(2.4999) = 2, y luego 2 * 100 = 200, así que cae en el rango 200-299. Un producto de 1299.99 cae en el rango 1200-1299.
Este patrón es extremadamente útil para crear histogramas, distribuciones de frecuencia, o cualquier análisis que necesite agrupar valores continuos en categorías discretas. Puedes cambiar el 100 por cualquier tamaño de rango: 10 para decenas, 500 para rangos de 500, etc.
Caso práctico: calcular descuentos por tramos
Muchos sistemas de descuento funcionan por tramos: 0-9 unidades sin descuento, 10-19 con 5%, 20-49 con 10%, etc. FLOOR te ayuda a calcular en qué tramo cae una cantidad:
SELECT
nombre,
stock,
FLOOR(stock / 10) AS tramo,
CASE FLOOR(stock / 10)
WHEN 0 THEN '0%'
WHEN 1 THEN '5%'
WHEN 2 THEN '10%'
WHEN 3 THEN '10%'
WHEN 4 THEN '10%'
ELSE '15%'
END AS descuento
FROM productos
LIMIT 5;| nombre | stock | tramo | descuento |
|---|---|---|---|
| iPhone 15 Pro | 50 | 5 | 15% |
| MacBook Air M2 | 30 | 3 | 10% |
| AirPods Pro | 100 | 10 | 15% |
| iPad Air | 25 | 2 | 10% |
| Apple Watch Series 9 | 45 | 4 | 10% |
Caso práctico: convertir minutos a horas y minutos
Si tienes una duración en minutos totales y quieres expresarla como "X horas Y minutos", necesitas FLOOR para las horas y MOD para los minutos restantes:
SELECT
137 AS minutos_totales,
FLOOR(137 / 60) AS horas,
MOD(137, 60) AS minutos_restantes,
CONCAT(FLOOR(137 / 60), 'h ', MOD(137, 60), 'min') AS duracion;| minutos_totales | horas | minutos_restantes | duracion |
|---|---|---|---|
| 137 | 2 | 17 | 2h 17min |
137 minutos = 2 horas completas y 17 minutos. FLOOR(137/60) = FLOOR(2.283) = 2. Si usaras ROUND, con 150 minutos obtendrías 3 horas (2.5 redondeado) cuando en realidad son 2 horas y 30 minutos. FLOOR siempre da las horas completas correctas.
FLOOR vs TRUNCATE: cuándo importa la diferencia
Con números positivos, FLOOR y TRUNCATE(x, 0) dan exactamente el mismo resultado. Muchos programadores los usan indistintamente sin darse cuenta de que con números negativos difieren:
SELECT
FLOOR(7.8) AS floor_pos,
TRUNCATE(7.8, 0) AS trunc_pos,
FLOOR(-7.8) AS floor_neg,
TRUNCATE(-7.8, 0) AS trunc_neg;| floor_pos | trunc_pos | floor_neg | trunc_neg |
|---|---|---|---|
| 7 | 7 | -8 | -7 |
Con 7.8, ambos dan 7. Con -7.8, FLOOR da -8 y TRUNCATE da -7. La diferencia conceptual es:
FLOORsiempre va hacia abajo en la recta numérica (hacia -∞)TRUNCATEsiempre va hacia cero (elimina decimales)
Si solo trabajas con números positivos (precios, cantidades, stocks), puedes usar cualquiera de las dos. Si trabajas con números que pueden ser negativos (diferencias, variaciones, coordenadas), elige cuidadosamente.
FLOOR con NULL
SELECT FLOOR(NULL) AS resultado;| resultado |
|---|
| NULL |
Como todas las funciones numéricas, FLOOR propaga los NULL. Si la columna puede ser nula, usa IFNULL o COALESCE:
SELECT FLOOR(IFNULL(precio, 0)) AS precio_truncado
FROM productos;En el siguiente artículo veremos ROUND para redondear al valor más cercano.
Escrito por Eduardo Lázaro
