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.
decimalespositivo: conserva esa cantidad de decimalesdecimales= 0: elimina todos los decimales, devuelve un enterodecimalesnegativo: 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;| truncado | redondeado |
|---|---|
| 3.99 | 4.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;| truncado | redondeado |
|---|---|
| 2.7 | 2.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_dec | dos_dec | un_dec | entero |
|---|---|---|---|
| 1234.567 | 1234.56 | 1234.5 | 1234 |
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;| decenas | centenas | miles |
|---|---|---|
| 1230 | 1200 | 1000 |
Compara con ROUND:
SELECT TRUNCATE(1678, -2) AS truncado, ROUND(1678, -2) AS redondeado;| truncado | redondeado |
|---|---|
| 1600 | 1700 |
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;| nombre | precio | sin_centavos | un_decimal |
|---|---|---|---|
| iPhone 15 Pro | 1299.99 | 1299 | 1299.9 |
| MacBook Air M2 | 1199.99 | 1199 | 1199.9 |
| AirPods Pro | 249.99 | 249 | 249.9 |
| iPad Air | 599.99 | 599 | 599.9 |
| Apple Watch Series 9 | 399.99 | 399 | 399.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;| nombre | precio | descuento_10_pct | precio_final |
|---|---|---|---|
| iPhone 15 Pro | 1299.99 | 129.99 | 1170.00 |
| MacBook Air M2 | 1199.99 | 119.99 | 1080.00 |
| AirPods Pro | 249.99 | 24.99 | 225.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_neg | floor_neg | truncate_pos | floor_pos |
|---|---|---|---|
| -4 | -5 | 4 | 4 |
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
