[SQLite] Decimales en campos calculados


redondeo en sqlite

En uno de los proyectos que estoy desarrollando con mis alumnos necesitábamos generar algunas consultas SQL en las que obtener varios decimales como resultado de realizar determinado cálculo con el contenido de algunas columnas.

Para nuestra sorpresa y, por defecto, SQLite se empeñaba en truncar a la parte entera todos los cálculos que realizábamos.

Por fortuna, existe una forma de obtener tantos decimales como quieras en SQLite

Si lanzamos la siguiente consulta SQL

SELECT 5/3 as MEDIA;

Observamos que se obtiene como resultado una cantidad entera obviando todos los decimales del resultado que se esperaba obtener (1,6666…)

campo calculado sin decimales en sqlite

El truco (para que realice la conversión correcta de tipos) consiste en indicar que, al menos, uno de los valores es de tipo real (y/o flotante si lo prefieres 😉 ) para lo cual añadiremos su parte decimal

obtener decimales en sqlite

NOTA: obsérvese que se ha utilizado 5.0 en lugar del 5 del ejemplo inicial (igualmente podrías haber optado por dividir entre 3.0 o multiplicar 1.0 por el 5/3 si te interesaba más por algún motivo o haber utilizado cálculos más complejos para obtener el valor final… la idea es que alguno de los valores de la expresión sea un decimal)

Redondeando el resultado

Si queremos limitar el número de cifras decimales (redondeando el resultado) deberemos hacer uso de la función printf (efectivamente, C/C++ es tu “amigo” para estas cosas) quedando la expresión de esta forma

SELECT printf(“%.2f”,5.0/3) AS MEDIA;

para obtener dos cifras decimales (2f) significativas

redondear a las centésimas en sqlite

Conclusión

Truco en SQLite para obtener valores numéricos con tantas cifras decimales como te interesen.

Y tú…

  • ¿Has tenido problemas para obtener valores decimales en SQLite?
  • ¿Conocías la posibilidad de redondear valores numéricos usando la función printf()?
  • ¿Conoces otra forma de obtener resultados similares?
  • ¿Te interesa que sigamos publicando artículos sobre SQLite?

2 comentarios en “[SQLite] Decimales en campos calculados

  1. Hola, entiendo que es necesario entender como define SQLite su lenguaje y sus tipos de datos (https://www.sqlite.org/datatype3.html).

    Sqlite nos da 5 tipos de datos, dos de ellos son INTEGER y REAL, y claro las operaciones matemáticas sobre enteros y reales difieren sutilmente.

    Vamos que no es lo mismo dividir sobre un conjunto de números que sobre otros. Computacionalmente es “más barato” dividir sobre “enteros”, así que Sqlite cuando detecta que los datos son enteros usa la función de división sobre enteros, por “economía”.

    Por eso hay que convertir a real el número, para que el sistema use otra operación matemática por defecto y divida sobre números reales y no sobre enteros.

    El problema está en saber que tipo de datos vamos a usar.

    Por ejemplo si se define el campo de una tabla como int, al hacer un select el sistema te deberá dar el resultado como un entero y la operación que uses con estos campos será sobre el conjunto de enteros, pero si lo que necesitas es que el resultado de la operación sea “real”, una de dos o defines el campo de la tabla a real o lo conviertes en el momento con alguna función de conversión.

    Aquí es donde llegan las incompatibilidades en las aplicaciones de bases de datos porque Sqllite tiene unos tipos de datos, MySQL otros y cada base de datos soporta a su manera este tipo de cosas.
    Si haces una aplicación innformática la construcción de la sentencia sql difiere según cada motor de base de datos y esto hace que sea complejo diseñar aplicaciones informáticas compatibles con distintos motores de bases de datos.

    Un saludo.

    1. Simplemente espectacular, gracias por el apunte amigo Julio.

      Como bien indicas, la gestión de los valores numéricos depende del gestor de bases de datos y, en nuestro caso, la necesidad de realizar cálculos sobre valores (que a todas luces eran enteros) surgió a posteriori debido a ciertas estadísticas que se desearon implementar.

      Dejamos aquí la anotación como futura referencia y tu consejo para nuevos desarrollos que, junto a mis alumnos, vaya a desarrollar.

      Muchas gracias compañero 👍

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.