假设您有一个浮点数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工作
答案 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;
}
}
}