2010-06-21 19 views
6

tengo un problema con valores dobles que necesito almacenar en una base de datos sqlite localizada en android. ya que estos valores representan los valores dobles GPS (lat & GNL), que realmente NEED una precisión absoluta hasta el número 9 de después de la coma.almacenando valores dobles en SQLite: ¿cómo garantizar la precisión?

ahora tengo una tabla como la siguiente:

CREATE TABLE x REAL lng; 

e insertar algo (hardcoded) como:

INSERT INTO x lng = '1.0'; 

y cuando la lectura de GNL de esta tabla en algunos (java) variable doble, i obtener un valor como "0,999956837" - esto me hace los valores bastante inútiles.

hay una forma de imponer la precisión que necesito aparte de almacenar los valores como campos de "texto" (lo que haría innecesarios los moldes costosos) o almacenarlos como enteros (es decir, necesito multiplicar/dividir en cada escritura/lectura -op)?

+0

Sólo por curiosidad, ¿se presentan el mismo comportamiento si utiliza INSERT INTO 'x lng = 1.0' en lugar de' INSERT INTO x lng = '1.0'', es decir, sin las comillas? – Joubarc

+0

síes - i usar comillas ... – xenonite

Respuesta

13

SQLite es typeless, eso significa que toda la representación está escrita como texto, probablemente la API de la envoltura hace algunas conversiones que no conoce, que obtiene esos resultados.

Si necesita almacenar los datos como una cadena lo hacen.

Justo cuando lee la doble, asegúrese de haber guardado en el formato correcto, puede usar getDouble en la columna.

+0

Si desea almacenar los números como cadenas, usted tiene que declarar la columna sin un tipo, o con afinidad de texto ('Text',' CHAR', o 'CLOB'). De lo contrario, tus cadenas se convertirán en dobles de todos modos. Sin embargo, para los datos no monetaria con menos de 15 dígitos significativos, 'double' es adecuado. – dan04

+2

bien - me encontré con el problema ... fue mi culpa - i utilizado "Cursor.getInt()" en lugar de getDouble() - una antigua reliquia del inicio del proyecto :( – xenonite

4

double tiene aproximadamente 17 dígitos decimales de precisión, por lo que si necesita 9 dígitos, no debería haber ningún problema (suponiendo que no haga ningún cálculo complejo de esos valores). Solo asegúrese de que nunca termine usando float, ya que solo tiene unos 7 dígitos de precisión.

También debe asegurarse de que comprende how binary floating-point works, y que lo hará siempre resultado aparentemente en valores "redondo" convertirse en un poco fuera - que simplemente no importa para la mayoría de las aplicaciones (incluyendo el suyo) mientras que happes en algún lugar de el décimo séptimo dígito decimal. Ver ese enlace también para alternativas para aplicaciones donde sí importa.

Cuestiones relacionadas