TRUNCATE (función)

La función TRUNCATE corta un número a un número específico de decimales sin redondear. A diferencia de ROUND, que mira el siguiente dígito para decidir si sube o baja, TRUNCATE simplemente elimina los dígitos sobrantes. Es como cortar con tijeras en lugar de redondear.

No confundas esta función con la sentencia TRUNCATE TABLE, que vacía una tabla entera. Aunque comparten nombre, son cosas completamente diferentes: una opera sobre números y la otra sobre tablas.

Sintaxis

TRUNCATE(numero, decimales)

A diferencia de ROUND, el segundo argumento es obligatorio. No puedes escribir TRUNCATE(3.14), siempre debes indicar cuántos decimales quieres conservar.

  • decimales positivo: conserva esa cantidad de decimales
  • decimales = 0: elimina todos los decimales, devuelve un entero
  • decimales negativo: reemplaza dígitos a la izquierda del punto decimal con ceros

La diferencia clave con ROUND

La mejor forma de entender TRUNCATE es compararla con ROUND:

SELECT
    TRUNCATE(3.999, 2) AS truncado,
    ROUND(3.999, 2) AS redondeado;
truncadoredondeado
3.994.00

ROUND mira el tercer decimal (9, que es mayor que 5) y decide subir: 3.999 → 4.00. TRUNCATE simplemente corta el tercer decimal y se queda con lo que hay: 3.999 → 3.99. No le importa si el dígito eliminado era 9 o 1, el resultado es el mismo.

Otro ejemplo que muestra la diferencia claramente:

SELECT
    TRUNCATE(2.789, 1) AS truncado,
    ROUND(2.789, 1) AS redondeado;
truncadoredondeado
2.72.8

TRUNCATE corta a 1 decimal y se queda con 2.7. ROUND ve que el segundo decimal (8) es mayor que 5 y sube a 2.8.

¿Cuándo usar TRUNCATE en vez de ROUND?

Usa TRUNCATE cuando quieras garantizar que el resultado nunca exceda el valor original. Esto es importante en escenarios financieros donde redondear hacia arriba significaría cobrar de más:

  • Descuentos al cliente: si calculas un 15% de descuento y da 37.567, cobras 37.56 (truncas), no 37.57 (redondeas). El cliente nunca paga más de lo que le corresponde.
  • Comisiones: si tu comisión es el 2.5% de 1000 y da 25.001, cobras 25.00, no 25.01.
  • Conversiones de moneda: si 100 USD a 0.923 EUR/USD da 92.3 EUR, entregas 92.3 EUR, no 92.4.

Diferentes valores de decimales

Veamos cómo se comporta TRUNCATE con distintas cantidades de decimales para que quede claro el patrón:

SELECT
    TRUNCATE(1234.5678, 3) AS tres_dec,
    TRUNCATE(1234.5678, 2) AS dos_dec,
    TRUNCATE(1234.5678, 1) AS un_dec,
    TRUNCATE(1234.5678, 0) AS entero;
tres_decdos_decun_decentero
1234.5671234.561234.51234

Con cada reducción de decimales, simplemente se cortan los dígitos de la derecha. Ninguno de los resultados supera al número original, que es la garantía fundamental de TRUNCATE.

Decimales negativos

Con un valor negativo en el segundo argumento, TRUNCATE reemplaza dígitos a la izquierda del punto decimal con ceros. Es como redondear a la decena, centena o millar más cercano, pero siempre hacia abajo:

SELECT
    TRUNCATE(1234.5678, -1) AS decenas,
    TRUNCATE(1234.5678, -2) AS centenas,
    TRUNCATE(1234.5678, -3) AS miles;
decenascentenasmiles
123012001000

Compara con ROUND:

SELECT TRUNCATE(1678, -2) AS truncado, ROUND(1678, -2) AS redondeado;
truncadoredondeado
16001700

TRUNCATE baja a 1600, ROUND sube a 1700 (porque 78 es mayor que 50).

Caso práctico: truncar precios

Cuando necesitas mostrar precios sin céntimos (por ejemplo, para una vista resumida), TRUNCATE te da el precio "sin superar":

SELECT
    nombre,
    precio,
    TRUNCATE(precio, 0) AS sin_centavos,
    TRUNCATE(precio, 1) AS un_decimal
FROM productos
LIMIT 5;
nombrepreciosin_centavosun_decimal
iPhone 15 Pro1299.9912991299.9
MacBook Air M21199.9911991199.9
AirPods Pro249.99249249.9
iPad Air599.99599599.9
Apple Watch Series 9399.99399399.9

Observa que 1299.99 truncado a 0 decimales da 1299, no 1300. Si usaras ROUND, obtendría 1300. La diferencia de 1 euro puede no parecer mucho, pero multiplicada por miles de transacciones, el impacto es significativo.

Caso práctico: calcular descuentos sin exceder

Cuando calculas un descuento, quieres asegurarte de que el precio final nunca sea menor de lo que debería:

SELECT
    nombre,
    precio,
    TRUNCATE(precio * 0.10, 2) AS descuento_10_pct,
    precio - TRUNCATE(precio * 0.10, 2) AS precio_final
FROM productos
LIMIT 3;
nombrepreciodescuento_10_pctprecio_final
iPhone 15 Pro1299.99129.991170.00
MacBook Air M21199.99119.991080.00
AirPods Pro249.9924.99225.00

Al truncar el descuento en lugar de redondearlo, te aseguras de que el descuento nunca es mayor de lo calculado, y por tanto el precio final nunca es menor de lo debido.

Comportamiento con números negativos

TRUNCATE con números negativos siempre va hacia cero (elimina decimales sin importar el signo). Esta es la diferencia fundamental con FLOOR:

SELECT
    TRUNCATE(-4.7, 0) AS truncate_neg,
    FLOOR(-4.7) AS floor_neg,
    TRUNCATE(4.7, 0) AS truncate_pos,
    FLOOR(4.7) AS floor_pos;
truncate_negfloor_negtruncate_posfloor_pos
-4-544

Con -4.7: TRUNCATE da -4 (corta hacia cero), FLOOR da -5 (baja hacia -∞). Con 4.7: ambos dan 4 (coinciden con positivos).

Si solo trabajas con números positivos, puedes usar FLOOR y TRUNCATE(x, 0) indistintamente. Si trabajas con negativos, debes elegir conscientemente cuál necesitas.

TRUNCATE con NULL

SELECT TRUNCATE(NULL, 2) AS resultado;
resultado
NULL

En el siguiente artículo veremos MOD para obtener el resto de una división.

Escrito por Eduardo Lázaro