圆形浮点数浮动数组

时间:2011-12-29 17:36:57

标签: objective-c arrays cocoa floating-point rounding

假设您有一个浮点数5.9476386和一个带有浮点数1,4,8,12的NSArray,...按升序存储。

NSArray *centers = [NSArray arrayWithObjects:
                     [NSNumber numberWithDouble:1],
                     [NSNumber numberWithDouble:4],
                     [NSNumber numberWithDouble:8],
                     [NSNumber numberWithDouble:12],
                     ...
                     nil];

我想要一个新的float,它将数字四舍五入到数组中最接近的数字。 所以在这种情况下,新浮点数将是4,因为4是最接近数组的数字到5.9476386。

我该怎么做?我在Objective-C / Cocoa工作

4 个答案:

答案 0 :(得分:2)

一个O(N)解决方案(其中N是数组中的项数)是遍历数组,计算距离d = | float - a [i] |对于数组a [i]中的每个项目,并在距离最小时存储值a [i]。

答案 1 :(得分:2)

假设数组已排序 - 并且只有在排序时 - 您可以使用方法-indexOfObject:inSortedRange:options:usingComparator:提供的二进制搜索(假设iOS≥4.0):

// assume theArray is an NSArray of NSNumber sorted in ascending order.

double target = 5.9476386;

NSUInteger count = [theArray count];
NSNumber* targetNumber = [NSNumber numberWithDouble:target];

NSUInteger index = [theArray indexOfObject:target
                             inSortedRange:NSMakeRange(0, count)
                                   options:NSBinarySearchingInsertionIndex
                           usingComparator:^(id x, id y) {
                                               return [(NSNumber*)x compare:y];
                                           }];

由于二进制搜索仅返回≥目标值5.9476386的最小数字,我们必须将它与数组中的前一项进行比较,以查看哪一项实际上更接近:

// for simplicity, I assume the array has at least 1 object here.
NSNumber* before = [theArray indexOfObject:(index == 0 ? 0 : index-1)];
NSNumber* after = [theArray indexOfObject:(index == count ? count-1 : index)];
double absDiffBefore = fabs([before doubleValue] - target);
double absDiffAfter = fabs([before doubleValue] - target);
return absDiffBefore < absDiffAfter ? before : after;

答案 2 :(得分:0)

遍历数组并计算浮点数到浮点数的差异,并比较结果的绝对值。

答案 3 :(得分:0)

假设您的数组按升序排序

 for ( int j=0; j< [myArray count]; j++ ) {
     float current = [((NSNumber *)[myArray objectAtIndex: j ]) floatValue];
     if ( current > myFloatNumber ) {
         if ( j==0 ) { return current;}  // 

         float prev = [((NSNumber *)[myArray objectAtIndex: j-1 ]) floatValue];

         if ( fabs(prev-myFloatNumber) > fabs(current-myFloatNumber) ) {
            return current;
         } else {
            return prev;
         }
     }
 }