Java浮点数比较不适用于Android上的RealmObject

时间:2016-10-01 08:24:24

标签: java android android-studio realm

[编辑]

此问题仅在RealmProxy类在Android Studio上的调试模式下未提供正确值时发生。阅读已接受的答案以获得良好实践。

[原始问题]

我有_allowedPercentageDiscount = 0.0perentageDiscount = 1.0,首先我尝试了

if(_allowedPercentageDiscount < percentageDiscount)
//do something

我也试过

 if (Float.floatToIntBits(_allowedPercentageDiscount) < Float.floatToIntBits(percentageDiscount)) {
            //but it never works
        }

但它永远不会成真。然后,经过一些搜索,我尝试了Float.compare,但它仍然没有结果。奇怪的是,它在评估窗口中给出了正确的结果(Android Studio)。

enter image description here

到底出了什么问题,怎么办?

// =============== 的修改

评论中要求的完整代码信息: 我有一个Product类:

class Product{
     public float _allowedPercentageDiscount, _discountPercentage;

     public float setDiscountPercentage(float percentageDiscount) {
       if (_allowedPercentageDiscount < percentageDiscount) {
           percentageDiscount = _allowedPercentageDiscount;
       } else if (percentageDiscount < 0)
           percentageDiscount = 0;
       return this._discountPercentage = percentageDiscount;
    }
}

现在我在另一个类(Android Fragment)的产品列表中调用此方法。但条件不起作用,并且对没有_allowedDiscountLimit的所有产品设置折扣。使用Lightweight-Stream-API在Android中对java 6,7的流支持。

private void applyDiscountPercentage(int discountPercentage) {
     Stream.of(cartProducts).forEach(product -> product.setDiscountPercentage(discountPercentage));
}

2 个答案:

答案 0 :(得分:0)

写两个变量

float _allowedPercentageDiscount=(float) 0.0;  // or 0.0f 
float perentageDiscount = (float) 1.0;         // or 1.0f
if(_allowedPercentageDiscount < perentageDiscount )

将返回true

但功能

  Float.compare(f1,f2)

如果两个值相同,则此函数返回0,当f1小于f2时返回小于0的任何整数,并且当f1> f2时返回任何大于0的整数 所以在你的图像中返回-1因为_allowedPercentageDiscount

此链接中此功能的描述 https://docs.oracle.com/javase/7/docs/api/java/lang/Float.html#compare(float,%20float)

答案 1 :(得分:0)

问题不在于代码或浮点数,而在于Realm.io类在Android上的行为方式,尤其是在与零拷贝概念相关的调试模式中。在调试时,任何实现RealmModelRealmObject的类都不会为您提供正确的变量值。这里提到Realm debugging and testing

因此,在这个问题的情况下,例如,_allowedPercentageDiscount的值为15,对于每个项目应该是不同的。错误地在逻辑中的其他位置分配的值15让我陷入需要对此值起作用的行。

<强>结果:

在计算和算法中使用Android上的Realm类进行调试时需要格外小心。由于在调试模式下无法看到realm对象的变量值,因此可以将这些类导出为普通模式在使用Realm.copyFromRealm()进行调试/开发时。成功后,您可以使用RealmResults进行效果和zero-copy领域实施。