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的使用