我正在基于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”等。只要小数点后面有任何小数部分,光标返回空。发生了什么事?
提前致谢!
答案 0 :(得分:8)
37.0在二进制浮点中是完全可表示的,因此您没有任何正常问题。 37.3 不可以完全表示 - 您的查询不匹配,因为数据库中的值不完全是37.3。
选项:
答案 1 :(得分:1)
当然,比较浮点值是不公平的。
不管怎么说,我看到SQLite uses 8-byte floating point values(就像DOUBLE
),所以37.0被认为等于37.3是奇怪的。除非你为你的例子修改了实际代码中使用的值吗?
您可以将LATITUDE
整数存储为十度,自己应用精度,并在读/写时转换值...
答案 2 :(得分:1)
我尝试使用<column> BETWEEN <min> AND <max>
并且它有效,宽容LATITUDE > 37.29 AND LATITUDE < 37.31
对我不起作用。但是我用这个提示尝试了BETWEEN
。
我的观察:
>
)不起作用。>
)工作正常。答案 3 :(得分:0)
以下内容对我有用:
将Column类型设置为Double,并使用Double数据类型为Java插入行。以某种方式双重工作......
答案 4 :(得分:0)
我遇到了同样的问题。我的Sqlite列是FLOAT类型。我不得不将我的类型为Float的Java变量转换为double,以使比较起作用。