2017-12-22 12 views
-2

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 경우, 내 비교 검사가 동일하지 반환 : 다음은 내 코드입니다. 이 유형의 비교를 처리하는 방법은 무엇입니까?

+0

가능한 복제 [가 부동 소수점 값을 비교하는 방법 위험?] (https://stackoverflow.com/questions/10334688/how-dangerous-is-it-to-compare-floating- 포인트 값) –

답변

0

이것은 부동 소수점 값을 비교할 때 고전적인 문제입니다. 부동 소수점이 작동하는 방식 때문에 안정적으로 부동 소수점을 테스트 할 수 없습니다.

대신 수행해야 할 작업은 두 부동 소수점 값의 차이 절대 값을 비교하고 그 차이가 적절히 작은 값 (예 : 0.001)보다 작은 지 확인하는 것입니다. 델타에 어떤 가치를 사용 하는가는 필요한 정밀도에 달려 있습니다.

1

두 가지 문제가 있습니다. 한 가지는 객체와 다른 부동 소수점 산술입니다.

첫째, 표현 :

avgRating>=firstMinVal&&avgRating<=firstMaxVal 

하지 당신이 그것을하지 생각하지 않습니다.

이 표현의 모든 변수는이 숫자를 포함하는 객체에 대한 포인터입니다 입력 NSNumber *의, 그리고 당신이하고있는 비교 포인터 사이에 - (Objective-) C에 완벽하게 합법적이다. 당신이 compare: 방법을 사용한다이 NSNumber객체를 비교하려면

,이 두 값의 순서를 나타내는 NSComparisonResult 값을 반환합니다.

그러나 개체 유형을 사용하지 않고 전체적으로 double 또는 float 값을 지정하는 것이 더 나을 것입니다.

두 경우 모두 부동 소수점 값 비교에주의해야합니다. 평등 (== 또는 !=)을 비교하면 제한된 정밀도 및 개수 문제로 인해 결과를 얻지 못할 수도 있습니다 부동 소수점). 주문 비교 (>, <, >=, <=)가 일반적으로 더 좋으며 그 중 하나만 사용하는 것처럼 보이지만 두 개의 "동일한"값에 대해 예기치 않은 결과가 계속 발생할 수 있습니다. 평등을 테스트하기 위해 절대 차이 (abs(), fabs())가 작은 값보다 작은 지 테스트하는 것이 일반적입니다.이 값은 응용 프로그램에 따라 다릅니다.

HTH