Desarrollo de Android – SQLite storage float

Cuando almaceno el valor de float con SQLiteDatabase.insert el valor almacenado será diferente que el original, vea abajo:

Tengo una anchura de la base de datos:

db.execSQL("CREATE TABLE IF NOT EXISTS info_values (" + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + "date DATE UNIQUE NOT NULL, " + "value REAL NOT NULL)"); 

Cuando introdujo por ejemplo 33.3 ancho:

 private class inputdlg_ok implements input_dlg.ReadyListener { public void ready(float newvalue) { Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); ContentValues values = new ContentValues(); values.put("date", sdf.format(d)); values.put("value", newvalue); database.insert("info_values", null, values); 

Tengo estos:

 sqlite> select * from info_values; 83|2012-04-04 09:06:22|33.2999992370605 84|2012-04-02 09:05:57|22.2000007629395 

He probado la anchura exec:

  String sql = "INSERT INTO info_values (date, value) " + "VALUES ('" + sdf.format(d) + "'," + Float.toString(newvalue) + ")"; database.execSQL(sql); 

Y esa forma funciona bien.

¿alguna idea?

One Solution collect form web for “Desarrollo de Android – SQLite storage float”

Nunca pensé que este hilo ayudaría a nadie más, pero allas aquí va .

Básicamente su problema es que usted utiliza float para el tipo en el código java. Float es con muy baja precisión. Lea el hilo al que enlazo, junto con todos los comentarios y el chat vinculado. Si aún tiene problemas, vuelva a escribir.

Usted probablemente sabe que los valores dobles se almacenan sólo hasta cierto grado de precisión en los ordenadores. A pesar de que los valores parecen extraños en la base de datos, esta es la mejor aproximación de sus valores que puede obtener al utilizar float. Con el doble usted puede aumentar la precisión, pero usted nunca conseguirá al estado perfecto. Tal vez si usted insiste en obtener valores precisos limitando el tamaño real en la base de datos podría ser una manera de ir.

EDIT Como no pude hacer creer que es un problema de precisión, incluyo el siguiente programa:

 float f = 22.2; printf("The number is: %.9f\n", f); 

La salida es:

 22.200000763 

Te sugiero que lo intentes. Como puede ver, este es exactamente el número que usted señala.

  • Preferencias compartidas vs base de datos
  • Excepción de la base de datos SQLite de Android - código 14 (no se puede abrir el archivo de base de datos)
  • Cómo importar la biblioteca Persistence Room a un proyecto de Android
  • Android: ¿ver bases de datos SQLite en el dispositivo?
  • ¿Cómo conectarse a SQLite DB con contraseña con OrmLite?
  • Android: Diseño de uno-a-muchos de SQLite
  • SQLite para la vista de tabla personalizada de Android (vista de SQL, no vista de Android) discrepancia?
  • Cómo implementar Exportar sqlite Para sobresalir / archivo csv en android?
  • Android Sqlite - "No hay tal tabla" Error
  • Limitaciones de SQLITE en Android - 25 tablas con 15 columnas cada una y 10k filas por tabla
  • La mejor manera de agrupar fotos con app: archivos o en la base de datos sqlite?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.