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.

  • SQLite externo Contenido del archivo que accede al error
  • Error de SQLIte de Android: No se pudo leer la fila 0, col 1 de CursorWindow
  • Comportamiento extraño de la consulta SQLite parametrizada
  • Android concurrencia sqlite sin excepciones
  • Problema sobre sqlite base de datos, no tal tabla:
  • ¿Cómo acceder a Android a una base de datos sqlite incluida en la carpeta de activos?
  • ¿Cómo carga todos los campos de una base de datos y ordeno el resultado después de una fila con GreenDao?
  • Forma preferida de actualizar sqlite db en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.