将浮点数舍入到预定列表中的最接近值?

时间:2013-03-08 13:53:18

标签: objective-c numbers rounding nearest-neighbor

我在显示器上有一个UI对象的有效大小的设置列表(背景图像以我想要的方式平铺的值),我想依次取每个对象的高度并将其四舍五入到该集合列表中的下一个最高值。例如,如果列表包含4983114148179,如果我传入了1我' d得到49,如果我传入30我会得到49,如果我传入50我会得到83等等。显然我我将编写一个单独的方法来返回其中一个有效大小,并依次在每个对象上调用它。

我是一个相当新的程序员,我正在努力找到一种有效的方法。我的想法是运行一个while循环,向该值添加一个,直到它等于其中一个设置值,然后返回该设置值。这应该有效,因为没有涉及小数,但我怀疑它是否是最安全的方式。有没有比循环更有效的方法?如果有人想提供我可以使用的示例代码或对象,我正在为iPhone使用Objective-C。

2 个答案:

答案 0 :(得分:2)

循环是正确的方法,但循环遍历值数组,直到找到适合的循环。这样,如果有5个有效大小,则最多只能循环5次。我用NSInteger作为类型写了一个简短的例子:

- (NSInteger)findValidSize:(NSInteger)aSize
{
    // create a NSArray containing NSNumber objects
    NSArray* validSizes = @[ @49, @83, @114, @148, @179 ];

    for (NSNumber* validSize in validSizes) {
        if (aSize <= [validSize integerValue]) {
            return [validSize integerValue];     // found it
        }
    }

    // nothing valid was found, now what? return the last valid size?
    return [[validSizes lastObject] integerValue];
}

答案 1 :(得分:0)

你可以这样做:

-(NSInteger)nearestNumberTo:(NSInteger)number{
    NSArray *array=@[@(49), @(83), @(114), @(148), @(179)];
    NSInteger nearest=[array[0]integerValue];
    /*
    for (NSInteger index=0; index<array.count; index++) {
        if ([array[index]integerValue]>=number){
            nearest=[array[index]integerValue];
            break;
        }
    }
    */
    for (NSNumber *num in array) {
        if ([num integerValue]>=number){
            nearest=[num integerValue];
            break;
        }
    }
    return nearest;
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{
    //49, 83, 114, 148, and 179
    NSInteger minimum=[self nearestNumberTo:86];
    NSLog(@"%ld",minimum);

}