Округлить деление до целого числа в большую сторону

есть ли простой способ округлить результат деления до целого числа?

Я хотел бы иметь это:

18/20 -> 1
19/20 -> 1
20/20 -> 1
21/20 -> 2
22/20 -> 2
23/20 -> 2

... и так далее ...

38/20 -> 2
39/20 -> 2
40/20 -> 2
41/20 -> 3
42/20 -> 3
43/20 -> 3

Должен ли я управлять материалом NSNumberFormatter?

Мне не удалось получить целочисленное значение с этим и выполнить целочисленное сравнение.

Заранее спасибо !


person Dough    schedule 05.07.2010    source источник


Ответы (4)


int x, y;
int result = (x + (y-1)) / y;

тестирование:

    int n = 20;
    for (int i = 1; i <= 50; i++) {         
        NSLog(@"%d+(%d-1) / %d = %d", i, n, n, (i+(n-1))/n);
    }
person ohho    schedule 05.07.2010

Вы используете стандартные функции ceil() и ceilf(), доступные в math.h.

person Claus Broch    schedule 05.07.2010

Стандарт C поддерживает double ceil(double x) и long double ceill(long double x). Возможно, у iPhone они есть? Если ваши данные в первую очередь представлены целыми числами, вам придется либо найти хитрый трюк, либо сначала преобразовать ваши целые числа в двойные.

person sarnold    schedule 05.07.2010

NSNumberFormatter используется при преобразовании между числами и строками. В дополнение к уже упомянутым функциям c для примитивов вы можете использовать NSDecimalNumber и NSDecimalNumberHandler для выполнения вычисления и округления заданных экземпляров NSNumber. В случае сомнений обратитесь к документации. Руководство по программированию чисел и значений

Пример кода для деления, округления до следующего целого числа и отображения результата.

NSDecimalNumber *denominator = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithInteger:20] decimalValue]];

NSDecimalNumberHandler *numberHandler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundUp scale:0 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];

for (NSInteger counter = 1; counter <= 50; counter++) {

    NSDecimalNumber *numerator = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithInteger:counter] decimalValue]];

    NSDecimalNumber *result = [[numerator decimalNumberByDividingBy:denominator withBehavior:numberHandler] retain];

    NSLog(@"%@/%@ -> %d", numerator, denominator, [result integerValue]);

    [result release];
}
person falconcreek    schedule 05.07.2010