4

当我存储浮点值 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);

这种形式效果很好。

任何想法?

4

1 回答 1

10

从来没有想过这个线程会帮助其他人,但唉,它就在这里。

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

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

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

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

输出是:

22.200000763

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

于 2012-04-14T13:11:51.530 回答