比较包含浮点值的NSNumber

问题描述 投票:-2回答:2

我在比较NSNumber时面临问题。以下是我的代码:

 NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
        [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
        NSNumber *avgRating= [formatter numberFromString:attemptedQuizDetailsModel.avgRating];

        NSNumber *firstMinVal=[NSNumber numberWithFloat:0.6];
        NSNumber *firstMaxVal=[NSNumber numberWithFloat:1.5];
        NSNumber *secondMinVal=[NSNumber numberWithFloat:1.6];
        NSNumber *secondMaxVal=[NSNumber numberWithFloat:2.5];
        NSNumber *thirdMinVal=[NSNumber numberWithFloat:2.6];
        NSNumber *thirdMaxVal=[NSNumber numberWithFloat:3.5];
        NSNumber *fourthMinVal=[NSNumber numberWithFloat:3.6];
        NSNumber *fourthMaxVal=[NSNumber numberWithFloat:4.5];
        NSNumber *fifthMinVal=[NSNumber numberWithFloat:4.6];

if(avgRating >= firstMinVal && avgRating <= firstMaxVal){
} else if (avgRating>=fifthMinVal) {
}

如果avgRating=4.6fifthMinVal=4.60,我的比较检查返回它们不相等。如何处理这种比较?

ios objective-c nsnumber
2个回答
1
投票

您有两个问题,一个与对象有关,另一个与浮点运算有关。

首先,表达式:

avgRating>=firstMinVal&&avgRating<=firstMaxVal

不会做你认为它做的事情。

这个表达式中的每个变量都是NSNumber *类型,也就是说它是一个指向包含数字的对象的指针,你正在进行的比较是在指针之间 - 这在(Objective-)C中是完全合法的。

要比较两个NSNumber对象,你应该使用compare:方法,这将返回一个NSComparisonResult值,表示两个值的顺序。

但是在你的情况下,你最好只是坚持使用doublefloat值,而不是使用对象类型。

在任何一种情况下,你必须小心比较浮点值,比较相等(==!=)可能由于有限的精度和数字基础问题而无法给出你期望的结果(如果使用浮点编程你应该学习的主题) 。排序比较(><>=<=)通常更好,你似乎只使用那些,但仍然可能给两个“相等”的值带来意想不到的结果。为了测试(in)相等,通常测试绝对差值(abs()fabs())小于一个小值 - 其大小取决于应用。

HTH


0
投票

这是比较浮点值的经典问题;由于浮点的工作方式,你无法可靠地测试它们是否相等。

你应该做的是比较两个浮点值之间差异的绝对值,看看差异是否小于一些适当的小值(比如,0.001)。您用于增量的值取决于您需要的精度。

© www.soinside.com 2019 - 2024. All rights reserved.