Android开发——SQLite存储浮点数

Posted

技术标签:

【中文标题】Android开发——SQLite存储浮点数【英文标题】:Android development - SQLite storing float 【发布时间】:2012-04-14 12:57:25 【问题描述】:

当我使用 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

我已经测试了宽度执行:

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

这种形式效果很好。

有什么想法吗?

【问题讨论】:

【参考方案1】:

从没想过这个帖子会帮助其他人,但唉,goes。

基本上你的问题是你在java代码中使用float作为类型。浮点数的精度非常低。阅读我链接到的线程,以及所有 cmets 和链接的聊天。如果您仍有任何问题,请回信。

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

编辑因为我无法让你相信这是一个精度问题,所以我包含以下程序:

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

输出是:

22.200000763

我建议你试试。如您所见,这正是您指出的数字。

【讨论】:

我什至知道我为什么使用 float 以及为什么 Google 在 API 中到处使用。因为它在32位CPU中是32位,而且因为精度已经足够了。 @vkaci 然后不用担心精度。但是,我认为速度差异确实可以忽略不计(我从未发现任何显着差异)。也可以参考这个帖子:***.com/q/1074474/1108032 对不起。这里的情况是数字为 22.2 并存储为 22.2000007629395。这不是精度问题!浮点数是 22.2,在 ContentValues.put 之后,数字仍然是 22.2(getAsString,getASFloat),但是在插入过程中发生了一些事情。我认为这是一个 API 错误。 @vkaci 我已经编辑了我的答案。如果你想看看我说的话。如果你愿意相信我的话。

以上是关于Android开发——SQLite存储浮点数的主要内容,如果未能解决你的问题,请参考以下文章

android之存储篇_SQLite数据库_让你彻底学会SQLite的使用

在 SQLite 上转换表达式结果,从浮点数到十进制数

Android入门第53天-在Android手机里使用SQLite内嵌式数据库

嵌入式DSP开发的定点数和浮点数

Android:将音频转换为浮点数[]

SQLite教程(内置日期和时间函数)