我在比较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.6
和fifthMinVal=4.60
,我的比较检查返回它们不相等。如何处理这种比较?
您有两个问题,一个与对象有关,另一个与浮点运算有关。
首先,表达式:
avgRating>=firstMinVal&&avgRating<=firstMaxVal
不会做你认为它做的事情。
这个表达式中的每个变量都是NSNumber *
类型,也就是说它是一个指向包含数字的对象的指针,你正在进行的比较是在指针之间 - 这在(Objective-)C中是完全合法的。
要比较两个NSNumber
对象,你应该使用compare:
方法,这将返回一个NSComparisonResult
值,表示两个值的顺序。
但是在你的情况下,你最好只是坚持使用double
或float
值,而不是使用对象类型。
在任何一种情况下,你必须小心比较浮点值,比较相等(==
或!=
)可能由于有限的精度和数字基础问题而无法给出你期望的结果(如果使用浮点编程你应该学习的主题) 。排序比较(>
,<
,>=
,<=
)通常更好,你似乎只使用那些,但仍然可能给两个“相等”的值带来意想不到的结果。为了测试(in)相等,通常测试绝对差值(abs()
,fabs()
)小于一个小值 - 其大小取决于应用。
HTH
这是比较浮点值的经典问题;由于浮点的工作方式,你无法可靠地测试它们是否相等。
你应该做的是比较两个浮点值之间差异的绝对值,看看差异是否小于一些适当的小值(比如,0.001
)。您用于增量的值取决于您需要的精度。