Два NSNumbers, созданные из одного и того же числа с плавающей точкой, не равны согласно == - PullRequest
4 голосов
/ 14 марта 2011

У меня есть несколько float с, которые я преобразовываю в NSNumber с и добавляю в массив, затем сортирую в числовом порядке.

Затем я беру исходные float с и преобразовываю их вNSNumber s, но если я попытаюсь сравнить их if(numinarray = newnum){, это никуда не денется.Когда я NSLog() из значения, значения совпадают:

float distance  = [barnardCastle distanceFromLocation:loc1] / 1000;
float distance2 = [billingham distanceFromLocation:loc1] / 1000;
float distance3 = [bishopAukland distanceFromLocation:loc1] / 1000;
float distance4 = [cockerton distanceFromLocation:loc1] / 1000;
float distance5 = [darlington distanceFromLocation:loc1] / 1000;
float distance6 = [guisborough distanceFromLocation:loc1] / 1000;
float distance7 = [hartlepool distanceFromLocation:loc1] / 1000;
float distance8 = [middlesbrough distanceFromLocation:loc1] / 1000;
float distance9 = [northallerton distanceFromLocation:loc1] / 1000;
float distance10 = [redcar distanceFromLocation:loc1] / 1000;
float distance11 = [stockton distanceFromLocation:loc1] / 1000;
float distance12 = [yarm distanceFromLocation:loc1] / 1000;


NSArray *nums, *sorted;

nums = [NSArray arrayWithObjects:
        [NSNumber numberWithFloat:distance],
        [NSNumber numberWithFloat:distance2],
        [NSNumber numberWithFloat:distance3],
        [NSNumber numberWithFloat:distance4],
        [NSNumber numberWithFloat:distance5],
        [NSNumber numberWithFloat:distance6],
        [NSNumber numberWithFloat:distance7],
        [NSNumber numberWithFloat:distance8],
        [NSNumber numberWithFloat:distance9],
        [NSNumber numberWithFloat:distance10],
        [NSNumber numberWithFloat:distance11],
        [NSNumber numberWithFloat:distance12],
        nil];

sorted = [nums sortedArrayUsingSelector:@selector(compare:)];

NSLog(@"nums sorted");
NSLog(@"distance is %f",distance);
NSNumber *intdist = [NSNumber numberWithFloat:distance]; 
NSNumber *intdist2 = [NSNumber numberWithFloat:distance2];
NSNumber *intdist3 = [NSNumber numberWithFloat:distance3];
NSNumber *intdist4 = [NSNumber numberWithFloat:distance4];
NSNumber *intdist5 = [NSNumber numberWithFloat:distance5];
NSNumber *intdist6 = [NSNumber numberWithFloat:distance6];
NSNumber *intdist7 = [NSNumber numberWithFloat:distance7];
NSNumber *intdist8 = [NSNumber numberWithFloat:distance8];
NSNumber *intdist9 = [NSNumber numberWithFloat:distance9];
NSNumber *intdist10 = [NSNumber numberWithFloat:distance10];
NSNumber *intdist11 = [NSNumber numberWithFloat:distance11];
NSNumber *intdist12 = [NSNumber numberWithFloat:distance12];
NSLog(@"int dist %@",intdist);
NSLog(@"int dist2 %@",intdist2);
NSLog(@"int dist3 %@",intdist3);
NSLog(@"int dist4 %@",intdist4);
NSLog(@"int dist5 %@",intdist5);
NSLog(@"int dist6 %@",intdist6);
NSLog(@"int dist7 %@",intdist7);
NSLog(@"int dist8 %@",intdist8);
NSLog(@"int dist9 %@",intdist9);
NSLog(@"int dist10 %@",intdist10);
NSLog(@"int dist11 %@",intdist11);
NSLog(@"int dist12 %@",intdist12);


nearestLoc = [[NSMutableArray alloc]init];

NSLog(@"about to loop");
for (int i=0; i < 12; i++) {
    Branches *branches = [[Branches alloc]init];
    NSLog(@"looping");

    NSNumber *index = [sorted objectAtIndex:i];

    NSNumber *intdist = [NSNumber numberWithFloat:distance]; 
    NSNumber *intdist2 = [NSNumber numberWithFloat:distance2];
    NSNumber *intdist3 = [NSNumber numberWithFloat:distance3];
    NSNumber *intdist4 = [NSNumber numberWithFloat:distance4];
    NSNumber *intdist5 = [NSNumber numberWithFloat:distance5];
    NSNumber *intdist6 = [NSNumber numberWithFloat:distance6];
    NSNumber *intdist7 = [NSNumber numberWithFloat:distance7];
    NSNumber *intdist8 = [NSNumber numberWithFloat:distance8];
    NSNumber *intdist9 = [NSNumber numberWithFloat:distance9];
    NSNumber *intdist10 = [NSNumber numberWithFloat:distance10];
    NSNumber *intdist11 = [NSNumber numberWithFloat:distance11];
    NSNumber *intdist12 = [NSNumber numberWithFloat:distance12];
    NSLog(@"int dist %@",intdist);
    NSLog(@"int dist2 %@",intdist2);
    NSLog(@"int dist3 %@",intdist3);
    NSLog(@"int dist4 %@",intdist4);
    NSLog(@"int dist5 %@",intdist5);
    NSLog(@"int dist6 %@",intdist6);
    NSLog(@"int dist7 %@",intdist7);
    NSLog(@"int dist8 %@",intdist8);
    NSLog(@"int dist9 %@",intdist9);
    NSLog(@"int dist10 %@",intdist10);
    NSLog(@"int dist11 %@",intdist11);
    NSLog(@"int dist12 %@",intdist12);
    NSLog(@"index %@",index);


    if (index == intdist) {

        branches.branchLoc = @"Barnard Castle";
        branches.distance = distance;
        [nearestLoc addObject:branches];
        NSLog(@"adding barnard castle");
    }

    if (index == intdist2) {
        branches.branchLoc = @"Billingham";
        branches.distance = distance2;
        [nearestLoc addObject:branches];

        NSLog(@"adding billingham");
    }

Я что-то упустил с использованием NSNumber?Если это так, как бы вы обойти это?

Ответы [ 2 ]

14 голосов
/ 14 марта 2011

Вместо использования ==, позвоните compare: или isEqualToNumber:. Когда вы используете ==, вы сравниваете указатели.

10 голосов
/ 14 марта 2011

Тест, который вы используете compare указатель, а не значение!

Сравнение NSNumber должно быть выполнено с

if([numInArray compare:newNum] == NSOrderedSame) {
    // do something
}
...