Android ormlite查询结果(涉及双精度/浮点)
在我的Android应用程序中,我有以下类:Android ormlite查询结果(涉及双精度/浮点),android,ormlite,Android,Ormlite,在我的Android应用程序中,我有以下类: @DatabaseTable(tableName="things") public class Thing { public static final String ID_FIELD_NAME = "id"; public static final String FLOAT_FIELD_NAME = "myFloatField"; @DatabaseField(generatedId=true,columnName=ID_
@DatabaseTable(tableName="things")
public class Thing {
public static final String ID_FIELD_NAME = "id";
public static final String FLOAT_FIELD_NAME = "myFloatField";
@DatabaseField(generatedId=true,columnName=ID_FIELD_NAME)
private int id;
@DatabaseField(columnName=FLOAT_FIELD_NAME)
private float myFloatField;
//[snip constructor and getters]
}
然后,在我的DBManager中,我执行以下操作:
Dao<Thing, Integer> dao = helper.getThingDao();
Thing tmp = dao.queryBuilder()
.where()
.eq(Thing.FLOAT_FIELD_NAME, otherThing.getFloatField());
Dao<Thing, Integer> dao = helper.getThingDao();
Thing tmp = dao.queryBuilder()
.where()
.eq(Thing.FLOAT_FIELD_NAME, Double.valueOf(otherThing.getFloatField()));
我在报纸上读到:
float或float DataType.float或DataType.float_OBJ作为SQL持久化
输入FLOAT
double或double DataType.double或DataType.double_OBJ作为持久化
SQL类型为DOUBLE
所以我的问题是:
这是我的代码中的一个bug,但我不知道我是如何正确地使用它的吗?ormlite对浮点数或其他东西有一个奇怪的功能
编辑:我正在使用ormlite-core-4.48.jar和ormlite-android-4.48.jar
编辑2:更重要的是,如果我将字段从float改为double,然后执行查询,它仍然不起作用。我需要使用Double.valueOf.避免==浮点测试,因为大多数浮点无法准确表示,而且舍入错误很常见 测试absa-b是否小于ε,而不是等于,其中ε是可接受的差值 SQL:
不太熟悉ORMLite,但我认为您可以使用where.rawsql,这至少应该允许您这样做。首先想到的是浮点数相等。这并不简单,因为浮点数不能代表所有的数字,精度有限,而且会出现舍入错误。一般来说,最好设置一个阈值,允许数字与epsilon不同,并使用absa-b
SELECT a, b from myTable where abs(a - b) < 0.001