5

我将浮点数放入基于 Android 的 SQLite 数据库中,如下所示:

private static final String DATABASE_CREATE = 
    "create table " + DATABASE_TABLE + " ("  
                    + KEY_ID + " integer primary key autoincrement, "
                    + KEY_FLOAT  + " REAL, " + ...
...

content.put(KEY_FLOAT, 37.3f);
db.insert(DATABASE_TABLE, null, content);

当我查询表格时:

Cursor cursor = db.query(false, DATABASE_TABLE, 
      new String[] { KEY_ID, KEY_FLOAT, ... },
      KEY_LATITUDE + "=37.3",
      null, null, null, null, null);

光标返回为空。如果我将 float 的值更改为 37.0,它可以正常工作,返回游标中的记录。

我已经对此进行了一定长度的测试,将数据库列规范从“REAL”更改为“float”等。只要我在小数点后有任何小数部分,光标就会返回空。到底是怎么回事?

提前致谢!

4

5 回答 5

8

37.0 完全可以用二进制浮点表示,因此您没有任何正常问题。37.3完全可表示 - 您的查询不匹配,因为数据库中的值不完全是 37.3。

选项:

  • 如果 SQLite 中存在这样的东西,请使用基于十进制的数字类型(我会检查一下)
  • 让您的查询使用容差,例如“LATITUDE > 37.29 AND LATITUDE < 37.31”。恐怕比较二进制浮点值是否完全相等只是自找麻烦。

编辑:我刚刚检查了文档,看起来 SQLite 不支持十进制非整数类型。我会在上面留下这个建议,因为它与其他数据库中的相同问题有关。

编辑:在许多情况下,Pascal 有效滚动您自己的数字类型的解决方案是一个很好的解决方案。计算出您想要的精度级别,并相应地乘/除...因此,如果您想要 2 个小数位的精度,请在存储值时乘以 100,然后在获取值后除以 100。当然,您的查询需要采用“相乘”形式。

于 2010-07-17T07:11:25.453 回答
1

当然,比较浮点值是否相等是个坏主意。

但是,我看到SQLite 使用 8 字节浮点值(类似于 a DOUBLE),所以奇怪的是 37.0 被认为等于 37.3。除非您为示例修改了实际代码中使用的值?

您可以将您LATITUDE的整数存储为十分之一度,自己应用精度,并在读/写时转换值...

于 2010-07-17T07:22:23.160 回答
1

我试过了<column> BETWEEN <min> AND <max>,它奏效了,宽容LATITUDE > 37.29 AND LATITUDE < 37.31对我不起作用。但我尝试BETWEEN了这个提示。

我的观察:

  1. 当我有一条记录时,大于 ( >) 不起作用。
  2. 如果有多个记录,大于 ( >) 可以完美运行。
于 2011-10-04T14:29:46.490 回答
0

以下事情对我有用:

将 Column 类型设置为 Double 并使用 Java 的 Double 数据类型插入行。不知何故,双工作...

于 2014-02-20T12:51:09.507 回答
0

我遇到了同样的问题。我的 Sqlite 列的类型为 FLOAT。我必须将 Float 类型的 Java 变量转换为 double 才能进行比较。

于 2014-03-09T19:04:39.430 回答