2010-10-02 42 views
5

Tengo una tabla SQLite3 con una columna con formato DECIMAL (7,2), pero cada vez que selecciono filas con valores que no tienen un segundo decimal distinto de cero (por ejemplo, 3.00 o 3.10), el resultado siempre tiene cero (s) final (es) perdido (por ejemplo, 3 o 3.1). ¿Hay alguna forma de que pueda aplicar una función de formateo en la instrucción SELECT para obtener el 2dp requerido? He intentado ROUND(), pero esto no tiene ningún efecto. De lo contrario, tengo que seguir convirtiendo los valores de las columnas resultantes en el formato requerido para mostrar (utilizando Python en mi caso) cada vez que hago una instrucción SELECT, lo cual es un verdadero problema.Problema de lugares decimales con SQLite

Ni siquiera me importa si el resultado es una cadena en lugar de numérica, siempre que tenga el número correcto de decimales.

Cualquier ayuda sería apreciada.

Alan

+0

Si va a escribir una función para hacer esto, una función FORMAT() sería útil :) – MikeAinOz

Respuesta

4

SQLite internamente utiliza la aritmética de coma flotante binaria IEEE, que realmente no se presta bien para mantener un número determinado de decimales. Para obtener ese tipo de manipulación decimal requeriría uno de:

  1. matemáticas de punto fijo, o
  2. IEEE decimal de coma flotante (poco común), o
  3. manejar todo como cadenas.

Formatear los valores (conversión de punto flotante a cadena) después de la extracción es la forma más sencilla de implementar cosas. Incluso podrías esconder eso dentro de una especie de envoltorio para que el resto del código no tenga que lidiar con las consecuencias. Pero si luego va a hacer aritmética sobre el valor, entonces es mejor no formatear y en su lugar trabajar con el valor devuelto por la consulta, porque el formato y volver a convertirlo en punto flotante binario (que Python usa, al igual que la gran mayoría de otros lenguajes modernos) pierde mucha información en la precisión reducida.

+0

Gracias Donal - Estaba empezando a pensar en la misma línea, pero lo ha dejado más claro. Voy a desarrollar una función display_format (fila) que convierta cada valor de fila a su formato de visualización correcto según la estructura de datos especificada en la tabla pragma (esto se aplicará principalmente a las columnas con decimales y fechas). Saludos. –

Cuestiones relacionadas