El problema del redondeo en SQL

Por ken burnside
El problema del redondeo en SQL
Stockbyte/Stockbyte/Getty Images

SQL tiene tres funciones que pueden redondear valores a una cantidad determinada de posiciones decimales. Puedes utilizar estas funciones para resolver varios problemas relacionados con bases de datos, desde deshacerte de fracciones de centavos en transacciones financieras hasta regularizar las entradas de datos a partir de varios instrumentos científicos. Si eres nuevo en el uso de SQL, sus funciones de redondeo podrían parecerte algo extrañas y causarte problemas de adaptación.

Redondeo convencional

La función"ROUND()" de SQL toma un valor existente y lo redondea a la cantidad indicada de posiciones decimales. El formato es el siguiente:

ROUND([valor],[n],[1]))

Aquí, "[valor]" es un valor decimal, y "[n]" es el número de dígitos al que se debe redondear el valor. Esta función redondea hacia arriba valores de 0,5 o más, y valores de 0,49 o menos hacia abajo. Escoger el valor "0" redondea a valores enteros. Escoger el valor "-1" redondea al múltiplo de 10 más cercano. El tercer parámetro de la función "ROUND()", "[1]", corta el número con el número indicado de posiciones decimales si se escoge cualquier valor distinto de cero. Una fuente significativa de problemas de redondeo inesperados es la fijación del tercer parámetro por errores tipográficos, con lo que el número resultado se trunca en vez de redondearse.

FLOOR y CEILING

SQL utiliza la función "FLOOR()" para forzar el redondeo hacia abajo de los valores hasta el entero más cercano, y la función "CEILING()" para redondear hacia arriba hasta el valor más cercano. Las dos funciones devuelven valores enteros. Incluso utilizando un tipo de datos flotante con un número de lugares decimales especificado, estas funciones devuelven un valor con ceros después de la posición decimal.

Tipos de datos recomendados

La razón más probable para la aparición de errores de redondeo en SQL es el uso de un tipo de datos no esperado para la expresión numérica en la función "ROUND()", o o la utilización de "FLOOR()" o "CEILING()" cuando se espera obtener un tipo de datos decimal en lugar de un entero. Si tu función de SQL te está dando resultados de redondeo no esperados, asegúrate de que la función "CAST()" que indica el número tenga el tipo de datos "integer", "decimal", "money" o "smallmoney". El tipo de datos "decimal" está limitado a sólo 38 dígitos en total, una limitación que afecta a pocas personas fuera de la comunidad científica.

Otros tipos de datos

Hay dos tipos de datos que devuelven valores numéricos y que pueden provocar problemas con la función "ROUND()". Son los tipos numéricos "real" y "float" en SQL, que se utilizan para guardar fracciones muy pequeñas que se redondean hacia arriba en la mayoría de versiones de SQL, con el último lugar decimal en el tipo de datos indicado. Algunas implementaciones de SQL redondean a cero, hacia abajo o de forma convencional. Cuando recibes datos en una base de datos SQL que pueden estar utilizando los tipos "real" o "float", utiliza las funciones "CAST()" o "CONVERT()" para convertirlos en tipos de datos "decimal".