Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ormlite查询结果(涉及双精度/浮点)_Android_Ormlite - Fatal编程技术网

Android ormlite查询结果(涉及双精度/浮点)

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_

在我的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_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-bSELECT a, b from myTable where abs(a - b) < 0.001