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;
bajasubesube_tambien
455

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_decimalescuatro_decimalesentero
3.143.14163

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;
decenascentenasmiles
123012001000

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;
nombreprecioiva_exactoivaprecio_con_iva
iPhone 15 Pro1299.99272.9979273.001572.99
MacBook Air M21199.99251.9979252.001451.99
AirPods Pro249.9952.497952.50302.49
iPad Air599.99125.9979126.00725.99
Apple Watch Series 9399.9983.997984.00483.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;
nombrepreciodescuento_exactodescuento_enteroprecio_final
iPhone 15 Pro1299.99195.001951105.00
MacBook Air M21199.99180.001801020.00
AirPods Pro249.9937.5038212.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_cincouno_cincodos_cincotres_cinco
0224

¿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_valtruncate_val
4.003.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:

Simulador SQL
Ctrl+Enter para ejecutar

En el siguiente artículo veremos TRUNCATE para truncar decimales sin redondear.

Escrito por Eduardo Lázaro