Разработка Android – SQLite, хранящая float

Когда я храню значение float в SQLiteDatabase.insert, сохраненное значение будет отличаться от оригинала, см. Ниже:

У меня ширина базы данных:

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

Когда я вставляю, например, 33,3 ширины:

 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); 

У меня есть:

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

Я проверил ширину exec:

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

И эта форма работает хорошо.

Есть идеи?

Никогда не думал, что эта нить поможет кому-то еще, но здесь все идет .

В основном ваша проблема заключается в том, что вы используете float для типа в Java-коде. Поплавок с очень низкой точностью. Прочитайте поток, на который я ссылаюсь, вместе со всеми комментариями и связанным чатом. Если у вас все еще есть проблемы, напишите.

Вероятно, вы знаете, что двойные значения сохраняются только на определенной точности на компьютерах. Несмотря на то, что значения выглядят странно в базе данных, это наилучшее приближение ваших значений, которые вы можете получить при использовании float. С двойным вы можете увеличить точность, но вы никогда не сможете достичь идеального состояния. Возможно, если вы настаиваете на том, чтобы получить точные значения, ограничивающие реальный размер в базе данных, может быть способ пойти.

EDIT Поскольку я не мог заставить вас поверить, что это проблема точности, я включаю следующую программу:

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

Выход:

 22.200000763 

Я предлагаю вам попробовать. Как вы можете видеть, это именно тот номер, который вы указываете.

Intereting Posts