当我存储浮点值 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)");
当我插入例如 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);
这种形式效果很好。
任何想法?
从来没想过这个帖子会对其他人有帮助,但还好这里goes https://stackoverflow.com/q/9044728/1108032.
基本上你的问题是你使用float
对于java代码中的类型。浮点数的精度非常低。阅读我链接到的线程,以及所有评论和链接的聊天。如果您还有任何问题,请回信。
您可能知道双精度值在计算机中仅以一定的精度存储。尽管这些值在数据库中看起来很奇怪,但这是使用 float 时可以获得的值的最佳近似值。使用 double 可以提高精度,但永远无法达到完美状态。如果您坚持要获取精确的值,那么限制数据库中的实际大小可能是一种方法。
EDIT因为我无法让您相信这是一个精度问题,所以我包含以下程序:
float f = 22.2;
printf("The number is: %.9f\n", f);
输出是:
22.200000763
我建议你尝试一下。正如您所看到的,这正是您指出的数字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)