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