ROUND
La función ROUND redondea un número al valor más cercano. A diferencia de CEIL (que siempre sube) y FLOOR (que siempre baja), ROUND decide en qué dirección ir según la parte decimal: si es menor que 0.5, baja; si es 0.5 o mayor, sube.
ROUND es probablemente la función de redondeo que más usarás en la práctica, porque en la mayoría de situaciones lo que quieres es la mejor aproximación posible, no forzar una dirección. Piensa en precios con IVA, promedios estadísticos, porcentajes de descuento: en todos esos casos, quieres el valor más cercano al real.
Sintaxis
-- Redondear a entero
ROUND(numero)
-- Redondear a N decimales
ROUND(numero, decimales)El segundo argumento es opcional y muy versátil:
- Si no lo pasas o es 0: redondea a entero
- Si es positivo: indica cuántos decimales conservar
- Si es negativo: redondea a decenas, centenas, miles, etc.
Comportamiento básico
Redondear a entero
Sin segundo argumento, ROUND redondea al entero más cercano. La regla es la clásica del redondeo escolar: si el decimal es 5 o más, sube; si es menos de 5, baja:
SELECT ROUND(4.4) AS baja, ROUND(4.5) AS sube, ROUND(4.6) AS sube_tambien;| baja | sube | sube_tambien |
|---|---|---|
| 4 | 5 | 5 |
Con 4.4, el decimal (0.4) es menor que 0.5, así que baja a 4. Con 4.5, está justo en el punto medio y sube a 5. Con 4.6, es mayor que 0.5 y sube a 5.
Redondear a decimales
Cuando pasas un segundo argumento positivo, ROUND conserva esa cantidad de decimales y redondea el último:
SELECT
ROUND(3.14159, 2) AS dos_decimales,
ROUND(3.14159, 4) AS cuatro_decimales,
ROUND(3.14159, 0) AS entero;| dos_decimales | cuatro_decimales | entero |
|---|---|---|
| 3.14 | 3.1416 | 3 |
Observa cómo con 4 decimales, 3.14159 se convierte en 3.1416: el quinto decimal (9) es mayor que 5, así que el cuarto decimal sube de 5 a 6. Este es exactamente el mismo proceso que haces mentalmente al redondear números, pero aplicado por MySQL.
Decimales negativos
Esta es una funcionalidad que mucha gente desconoce: si el segundo argumento es negativo, ROUND redondea a la izquierda del punto decimal. Es decir, puedes redondear a decenas, centenas, miles, etc.:
SELECT
ROUND(1234, -1) AS decenas,
ROUND(1234, -2) AS centenas,
ROUND(1234, -3) AS miles;| decenas | centenas | miles |
|---|---|---|
| 1230 | 1200 | 1000 |
Con -1, el dígito de las unidades (4) es menor que 5, así que baja: 1234 → 1230. Con -2, el dígito de las decenas (3) es menor que 5: 1234 → 1200. Con -3, el dígito de las centenas (2) es menor que 5: 1234 → 1000.
Un ejemplo donde esto es útil: si quieres mostrar un precio como "aproximadamente 1.300 euros" en lugar de "1.299,99 euros":
SELECT
nombre,
precio,
ROUND(precio, -2) AS precio_aproximado
FROM productos
WHERE precio > 500;Caso práctico: calcular IVA redondeado
El caso de uso más habitual de ROUND es aplicar porcentajes y redondear el resultado a 2 decimales (céntimos). Sin ROUND, el IVA del 21% sobre 249.99 sería 52.4979, que no es un precio válido:
SELECT
nombre,
precio,
precio * 0.21 AS iva_exacto,
ROUND(precio * 0.21, 2) AS iva,
ROUND(precio * 1.21, 2) AS precio_con_iva
FROM productos
LIMIT 5;| nombre | precio | iva_exacto | iva | precio_con_iva |
|---|---|---|---|---|
| iPhone 15 Pro | 1299.99 | 272.9979 | 273.00 | 1572.99 |
| MacBook Air M2 | 1199.99 | 251.9979 | 252.00 | 1451.99 |
| AirPods Pro | 249.99 | 52.4979 | 52.50 | 302.49 |
| iPad Air | 599.99 | 125.9979 | 126.00 | 725.99 |
| Apple Watch Series 9 | 399.99 | 83.9979 | 84.00 | 483.99 |
Observa la diferencia entre iva_exacto (con 4 decimales) e iva (redondeado a 2). En aplicaciones reales, siempre debes redondear los valores monetarios a 2 decimales antes de almacenarlos o mostrarlos. ROUND(x, 2) es tu mejor amigo para esto.
Caso práctico: promedios legibles
Los promedios casi siempre producen números con muchos decimales. ROUND los hace presentables:
SELECT
ROUND(AVG(precio), 2) AS precio_medio,
ROUND(AVG(stock), 0) AS stock_medio,
ROUND(AVG(precio) / MAX(precio) * 100, 1) AS pct_del_maximo
FROM productos;Sin ROUND, el precio medio podría ser algo como 547.9945000000, que no es útil para nadie. Con ROUND(x, 2), obtienes 547.99, que es claro e informativo.
La cantidad de decimales que debes usar depende del contexto: para precios, 2 decimales. Para porcentajes, 1 o 2. Para estadísticas, lo que tenga sentido para tu audiencia.
Caso práctico: redondear descuentos
Cuando calculas descuentos porcentuales, los resultados suelen tener muchos decimales. ROUND con diferentes precisiones te permite elegir el nivel de detalle:
SELECT
nombre,
precio,
ROUND(precio * 0.15, 2) AS descuento_exacto,
ROUND(precio * 0.15, 0) AS descuento_entero,
ROUND(precio * 0.85, 2) AS precio_final
FROM productos
LIMIT 3;| nombre | precio | descuento_exacto | descuento_entero | precio_final |
|---|---|---|---|---|
| iPhone 15 Pro | 1299.99 | 195.00 | 195 | 1105.00 |
| MacBook Air M2 | 1199.99 | 180.00 | 180 | 1020.00 |
| AirPods Pro | 249.99 | 37.50 | 38 | 212.49 |
El redondeo bancario (banker's rounding)
Hay un detalle importante que mucha gente desconoce: cuando el valor está exactamente en 0.5, MySQL con tipos DECIMAL usa el redondeo bancario (también llamado "redondeo al par"). En lugar de siempre subir en el .5, redondea al entero par más cercano:
SELECT ROUND(0.5) AS cero_cinco, ROUND(1.5) AS uno_cinco, ROUND(2.5) AS dos_cinco, ROUND(3.5) AS tres_cinco;| cero_cinco | uno_cinco | dos_cinco | tres_cinco |
|---|---|---|---|
| 0 | 2 | 2 | 4 |
¿Por qué? Porque 0.5 se redondea a 0 (par), 1.5 se redondea a 2 (par), 2.5 se redondea a 2 (par) y 3.5 se redondea a 4 (par). Este sistema evita un sesgo estadístico: si siempre subieras el .5, los promedios de muchos redondeos tenderían a ser demasiado altos.
Este comportamiento aplica a valores DECIMAL exactos. Con DOUBLE o FLOAT, el comportamiento puede variar ligeramente porque la representación en punto flotante puede hacer que un valor que parece 2.5 sea internamente 2.50000000001, lo que siempre redondeará hacia arriba.
En la práctica, esta diferencia rara vez importa para una sola operación, pero puede ser significativa si sumas miles de valores redondeados (como en contabilidad).
ROUND vs TRUNCATE
ROUND y TRUNCATE se parecen cuando el número está lejos del punto medio, pero difieren fundamentalmente:
ROUND(3.7, 0)= 4 (redondea al más cercano)TRUNCATE(3.7, 0)= 3 (simplemente corta)
SELECT
ROUND(3.999, 2) AS round_val,
TRUNCATE(3.999, 2) AS truncate_val;| round_val | truncate_val |
|---|---|
| 4.00 | 3.99 |
ROUND decide que 3.999 redondeado a 2 decimales es 4.00 (porque el tercer decimal, 9, es mayor que 5). TRUNCATE simplemente corta el tercer decimal y se queda con 3.99. Usa ROUND cuando quieras precisión. Usa TRUNCATE cuando quieras cortar sin redondear (por ejemplo, para no cobrar de más al cliente).
ROUND con NULL
SELECT ROUND(NULL, 2) AS resultado;| resultado |
|---|
| NULL |
Practica con ROUND
Usa el editor para redondear valores numéricos:
En el siguiente artículo veremos TRUNCATE para truncar decimales sin redondear.
Escrito por Eduardo Lázaro
