Android开发 - SQLite的存储浮子
问题描述:
当我存储浮点值WIDT SQLiteDatabase.insert所存储的值将是比原来的不同,见下文:Android开发 - SQLite的存储浮子
我有一个数据库宽度:
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);
和形式的作品好。
有什么想法吗?
答
从来没有想过这个线程会帮助任何人,但allas在这里它goes。
基本上你的问题是你在java代码中使用float
作为类型。浮法精度非常低。阅读我链接的主题,以及所有评论和关联聊天。如果您仍然有任何问题,请回复。
您可能知道,在计算机中只能保存一定的精度。尽管这些值在数据库中看起来很奇怪,但这是使用float时可以得到的值的最佳近似值。加倍可以提高精度,但你永远不会达到完美的状态。也许如果你坚持要获得限制数据库中实际大小的精确值可能是一种方法。
编辑,因为我无法让你相信这是一个精密的问题,我有以下程序:
float f = 22.2;
printf("The number is: %.9f\n", f);
输出是:
22.200000763
我建议你试试。正如你所看到的,这正是你指出的数字。
我甚至知道为什么我会使用float以及Google为什么在API中使用各处。因为它是32位CPU中的32位,并且精度足够。 – Tectona 2012-04-14 18:06:13
@vkaci然后就是不用担心精度。然而,速度差异是真的可以忽略我认为(我从来没有发现任何显着差异)。你也可以参考这个主题:http://*.com/q/1074474/1108032 – 2012-04-14 18:10:42
对不起。这里的情况是数字是22.2,并且存储为22.2000007629395。这不是精确问题!浮点数是22.2,在ContentValues.put之后数字仍然是22.2(getAsString,getASFloat),但是在插入过程中发生了一些事情。我认为这是一个API错误。 – Tectona 2012-04-14 18:11:06