Trabajar con número reales suele presentar siempre desafíos, especialmente cuando se necesita comparar valores calculados por diferentes funciones. La precisión y los decimales de los valores son un problema para realizar comparaciones exactas. En SQL, comparaciones simples con números reales, como =
o !=
, no suelen devolver los resultados esperados. Algo que no es exclusivo de SQL, sino de la naturaleza de los números en punto flotante y las limitaciones inherentes a su representación. Por lo que es necesario usar otras estrategias para poder realizar la comparación de números reales en SQL.
En esta entrada, se analizará el problema de la comparación de números reales en SQL, sus desafíos y algunas soluciones para comparar valores con precisión controlada. Se verá cómo resolver este problema usando funciones como ROUND
, CAST
, rangos de tolerancia ( BETWEEN
) y diferencias absolutas ( ABS
).
El desafío de los números reales
Los números reales (valores decimales o en punto flotante) son claves para muchas aplicaciones, desde los cálculos científicos hasta los sistemas financieros. Por lo que es habitual usarlos en múltiples aplicaciones. Sin embargo, debido a cómo se almacenan internamente, los números reales a menudo tienen más decimales de los que se pueden ver directamente o inconsistencias mínimas en su representación binaria.
Por ejemplo, supongamos que se desea buscar el número 1.2354
en un campo de una tabla. En la base de datos, este campo se puede almacenar con valores como 1.2353999999
o 1.2354000001
debidos a inconsistencias mínimas en su representación binaria. Aunque estos valores son cercanos al buscado, una comparación directa utilizando =
fallará porque los valores no son exactamente iguales.
El problema se vuelve más evidente en situaciones como:
- Cálculos financieros, donde los resultados deben ser precisos a centavos.
- Datos científicos, donde la precisión extendida genera valores aparentemente "iguales" pero que difieren en las últimas cifras decimales.
Opciones para comparar números reales en SQL
A continuación, se muestran las soluciones más habituales que se puede usar al enfrentar el desafío de comparar números reales en SQL.
La función ROUND
permite redondear un número a un número específico de decimales antes de realizar la comparación. Esto es útil cuando se necesita comparar números basándose en un nivel de precisión definido. La sintaxis básica de esta función es:
ROUND(campo, precisión)
Supongamos que se tiene una tabla llamada transacciones
con un campo monto
. Se desea encontrar los registros donde el monto
sea aproximadamente 1.2354
con una precisión de 4 decimales. La siguiente consulta seleccionará estos valores:
SELECT * FROM transacciones WHERE ROUND(monto, 4) = 1.2354;Cuándo usarlo:
- Cuando el redondeo es suficiente para resolver las discrepancias.
- Útil en casos donde el nivel de precisión es fijo, como en cálculos financieros que se fijan en céntimos.
- Al redondear el valor se puede alterar ligeramente los resultados.
- Puede ser ineficiente en tablas grandes debido a la necesidad de redondear todos los valores.
2. Comparación dentro de un rango con BETWEEN
Si se prefiere buscar números similares dentro de un rango específico en lugar de redondear, se puede recurrir al operador BETWEEN
. Esto permite definir explícitamente un margen de tolerancia alrededor del número deseado. La sintaxis básica de este operador es:
campo BETWEEN valor_inferior AND valor_superior
Localizar los registros donde el monto
esté dentro de un rango de ±0.0001 de 1.2354
. Esto es lo que se consigue con la siguiente consulta:
SELECT * FROM transacciones WHERE monto BETWEEN 1.2353 AND 1.2355;Cuándo usarlo:
- Cuando se puede definir un margen de tolerancia fijo.
- Útil en datos científicos o mediciones donde la tolerancia es aceptable.
- Fácil de leer y entender.
- Requiere definir explícitamente los límites del rango.
3. Diferencia absoluta con ABS
La función ABS
permite calcular el valor absoluto de una expresión. Esta función se puede utilizar para verificar si la diferencia entre dos números está dentro de un rango permitido.
La sintaxis básica de esta función es:
ABS(campo1 - campo2) < tolerancia
Para localizar los registros donde la diferencia absoluta entre el monto
y 1.2354
sea menor a 0.0001
se puede usar la siguiente consulta:
SELECT * FROM transacciones WHERE ABS(monto - 1.2354) < 0.0001;Cuándo usarlo:
- Cuando se necesita una tolerancia flexible sin definir límites exactos.
- Útil en aplicaciones donde las comparaciones relativas son más importantes que los valores absolutos.
- Requiere cálculos adicionales en cada fila.
- Puede ser menos eficiente en tablas grandes.
4. Truncamiento con CAST
En lugar de redondear, CAST
permite truncar un número a una cantidad específica de decimales, lo que puede ser útil cuando se desea eliminar cualquier dígito adicional sin redondear. La sintaxis básica de esta función es:
CAST(campo AS DECIMAL(m, n))
Donde m
es la longitud total y n
es el número de decimales.
En la siguiente consulta se trunca el valor de monto
a 4 decimales y se compara con el número 1.2354
.
SELECT * FROM transacciones WHERE CAST(monto AS DECIMAL(10, 4)) = 1.2354;Cuándo usarlo:
- Cuando se desea eliminar decimales adicionales en lugar de redondearlos.
- Útil en aplicaciones donde la precisión estricta es importante.
- Modifica la forma en que se almacenan y manejan los datos internamente.
- Puede no ser adecuado si se necesita mantener todos los decimales originales.
Comparativa de métodos vistos
En la siguiente tabla se muestra una comparativa de los métodos vistos en esta entrada que se puede usar para comparar números reales en SQL.
Conclusiones
La comparación de números reales en SQL, o en cualquier sistema, suele ser un desafío. Afortunadamente existen diferentes herramientas para manejar estas situaciones dependiendo de las necesidades concretas del problema:
-
Para comparaciones con precisión fija,
ROUND
es una solución directa y eficiente. -
Si se necesita definir tolerancias claras,
BETWEEN
es ideal para trabajar con rangos. -
En aplicaciones donde se priorizan diferencias relativas,
ABS
proporciona flexibilidad y precisión. -
Cuando la precisión estricta es clave,
CAST
es útil para truncar valores.
Seleccionar el método adecuado dependerá del problema específico: el tipo de datos que se maneja, la precisión requerida y el impacto en el rendimiento.
Nota: La imagen de este artículo fue generada utilizando un modelo de inteligencia artificial.