SQLite查询具有浮点数的where子句是否失败?

我正在基于 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);

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

我已经测试了一段时间,将数据库列规范从“REAL”更改为“float”等.只要我在小数点后面有任何小数部分,光标返回空.到底是怎么回事?

提前致谢!

解决方法

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

选项:

>使用基于十进制的数字类型,如果SQLite中存在这样的东西(我会在一分钟内检查)
>使您的查询使用容差,例如“LATITUDE> 37.29和LATITUDE< 37.31”.比较二进制浮点值以获得精确的相等只是在寻找麻烦,我担心.
编辑:我刚刚检查了the docs,看起来SQLite不支持十进制非整数类型.我将在上面留下这个建议,因为它与其他数据库中的相同问题有关.

编辑:在许多情况下,Pascal的有效滚动您自己的数字类型的解决方案是一个很好的解决方案.计算出你想要的精度水平,然后相应地进行乘法/除法…所以如果你想要2位小数的精度,你在存储一个值时乘以100,然后在取出它之后除以100.当然,您的查询需要采用“倍增”形式.

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能