比较包含浮点值的NSNumber

时间:2017-12-22 05:40:05

标签: ios objective-c nsnumber

我在比较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,我的比较检查将返回它们不相等。如何处理这种比较?

2 个答案:

答案 0 :(得分:1)

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

首先,表达式:

avgRating>=firstMinVal&&avgRating<=firstMaxVal

执行您认为的操作。

此表达式中的每个变量都是NSNumber *类型,即它是指向包含数字的对象的指针,而您正在进行的比较是在指针之间 - 这是完美的合法的(目标 - )C。

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

但是,在您的情况下,只需坚持使用doublefloat值并且不使用对象类型,情况会更好。

在任何一种情况下,您都必须小心比较浮点值,比较相等(==!=)可能无法给出您期望的结果,因为精度和数字基数问题有限(a如果使用浮点编程,你应该学习的主题)。排序比较(><>=<=)通常会更好,而您似乎只使用这些比较,但仍可能会给出两个意外的结果&# 34;等于&#34;值。为了测试(in)相等,通常测试绝对差值(abs()fabs())是否小于一个小值 - 其大小取决于应用。

HTH

答案 1 :(得分:0)

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

您应该做的是比较两个浮点值之间差异的绝对值,并查看差异是否小于某个适当小的值(例如,0.001)。您对delta使用的值取决于您需要的精度。