ormlite奇怪的查询结果(涉及double / float)

时间:2014-08-19 16:23:17

标签: 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_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());

事实证明偶尔tmp的证据是null。 我尝试了许多不同的东西,而且每次我发现正在努力获得正确Thing的内容如下:

Dao<Thing, Integer> dao = helper.getThingDao();
Thing tmp = dao.queryBuilder()
                    .where()
                    .eq(Thing.FLOAT_FIELD_NAME, Double.valueOf(otherThing.getFloatField()));

我读了the docs

  

float或Float(DataType.FLOAT或DataType.FLOAT_OBJ)作为SQL保留   键入FLOAT。

     

double或Double(DataType.DOUBLE或DataType.DOUBLE_OBJ)保持为   SQL类型DOUBLE。

所以我的问题是: 这是我的代码中的一个错误(但我不知道如何,我没有正确使用where()?),一个奇怪的东西ormlite与float s或其他完全一样?< / p>


编辑:我正在使用ormlite-core-4.48.jar和ormlite-android-4.48.jar。


编辑2:还有什么,如果我将字段从float更改为double然后执行查询,它仍然无法正常工作。我需要使用Double.valueOf()

1 个答案:

答案 0 :(得分:0)

避免==测试浮点数,因为大多数浮点数无法准确表示,并且舍入误差很常见。

而不是等于,测试abs(a - b) < epsilon,其中epsilon是您接受的差异。

SQL:

SELECT a, b from myTable where abs(a - b) < 0.001

对ORMLite不太熟悉,但我发现你可以做where.raw(sql),这至少应该允许你这样做。