Android开发 - SQLite存储浮点数

Tec*_*ona 4 sqlite floating-point android

当我存储浮点值widt 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)");
Run Code Online (Sandbox Code Playgroud)

当我插入例如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);
Run Code Online (Sandbox Code Playgroud)

我有这些:

sqlite> select * from info_values;
83|2012-04-04 09:06:22|33.2999992370605
84|2012-04-02 09:05:57|22.2000007629395
Run Code Online (Sandbox Code Playgroud)

我测试了宽度exec:

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

那种形式很好用.

任何的想法?

Bor*_*jev 10

没想到这个线程可以帮助其他人,但allas这里.

基本上你的问题是你使用floatjava代码中的类型.浮动的精度非常低.阅读我链接到的主题,以及所有评论和链接的聊天.如果您还有任何问题请回信.

您可能知道,双精度值只能在计算机中以一定的精度存储.尽管数据库中的值看起来很奇怪,但这是使用float时可以获得的值的最佳近似值.使用双倍可以提高精度,但永远不会达到完美状态.也许如果你坚持要获得精确的数值限制数据库中的实际大小可能是一种方法.

编辑因为我不能让你相信这是一个精确的问题我包括以下程序:

float f = 22.2;
printf("The number is: %.9f\n", f);
Run Code Online (Sandbox Code Playgroud)

输出是:

22.200000763
Run Code Online (Sandbox Code Playgroud)

我建议你试一试.正如您所看到的,这正是您指出的数字.