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).
Tabla de contenidos
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:
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.
ROUNDLa 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:
Consideraciones:
BETWEENSi 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:
Consideraciones:
ABSLa 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:
Consideraciones:
CASTEn 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:
Consideraciones:
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.
| Método | Ventajas | Desventajas | Casos de Uso |
|---|---|---|---|
| ROUND | Sencillo, ajusta a una precisión fija | Puede alterar ligeramente los valores | Cálculos financieros |
| BETWEEN | Fácil de entender y usar | Requiere calcular los límites | Mediciones científicas, tolerancias |
| ABS | Flexible y preciso | Más costoso computacionalmente | Comparaciones relativas |
| CAST | Elimina decimales adicionales | No redondea, puede perder información | Aplicaciones de precisión estricta |
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:
ROUND es una solución directa y eficiente.BETWEEN es ideal para trabajar con rangos.ABS proporciona flexibilidad y precisión.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.
Hace poco publiqué una entrada en la que trataba de un sesgo bien documentado: aferrarse…
En un entrada previa explicamos qué son el WOE y el IV y por qué…
Seguimos evolucionando el laboratorio de Analytics Lane y hoy lanzamos la versión 1.1, disponible en:…
“El interés compuesto es la octava maravilla del mundo. El que lo entiende lo gana…
Tienes los datos de ventas de tres productos en dos años distintos y quieres saber…
Imagina la situación. Tu equipo lleva tres años con un modelo en producción. No es…
This website uses cookies.