Округлення чисел у Objective-C


74

Я намагаюся зробити деяке округлення чисел і перетворення на рядок, щоб покращити результат у програмі Objective-C.

У мене є плаваюче значення, яке я хотів би округлити до найближчого .5, а потім використати його для встановлення тексту на мітку.

Наприклад:

1.4 буде рядком із: 1.5

1.2 буде рядком із: 1

0,2 - це рядок: 0

Я деякий час шукав відповіді в Google, але, будучи нубом із Objective-C, я не знаю, що шукати! Отже, я б дуже вдячний за вказівник у правильному напрямку!

Дякую, Еш


27
За винятком додавання вартості до етикетки (яку він оголошує своїм наміром, а насправді не запитує), його запитання не має нічого спільного з какао і всім, що пов’язано з Obj-C
Джейсон Коко

Відповіді:


100

Дякую за вказівки всім, мені вдалося придумати рішення:

float roundedValue = round(2.0f * number) / 2.0f;
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:1];
[formatter setRoundingMode: NSNumberFormatterRoundDown];

NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:roundedValue]];
[formatter release];

Вищезазначене працює для тестових випадків, якими я займався, але якщо хтось знає кращий спосіб зробити це, мені буде цікаво його почути!


7
Якщо це виводиться в текстове поле, ви можете просто прикріпити до нього форматтер.
Чак

38
float floatVal = 1.23456;

Округлення

int roundedVal = lroundf(floatVal); 

NSLog(@"%d",roundedVal);

Округлення вгору

int roundedUpVal = ceil(floatVal); 

NSLog(@"%d",roundedUpVal);

Округлення вниз

int roundedDownVal = floor(floatVal);

NSLog(@"%d",roundedDownVal);


24

Використовуйте lroundf (), щоб округлити плаваюче число до цілого числа, а потім перетворити ціле число на рядок.


Це здається дещо заплутаним, тому я уточнюю. lroundf()округлює плаваюче число до цілого числа і повертає йому довге ціле число (щоб перетворити його на рядок, який можна використовувати stringWithFormat:).
Даніель



6

простий спосіб:

float theFloat = 1.23456;
int rounded = roundf(theFloat); NSLog(@"%d",rounded);
int roundedUp = ceil(theFloat); NSLog(@"%d",roundedUp);
int roundedDown = floor(theFloat); NSLog(@"%d",roundedDown);
// Note: int can be replaced by float


2

Наступна техніка працювала для мене у фінансовій програмі.

 NSString *dd=[NSString stringWithFormat:@"%0.2f",monthlyPaymentCalculated];

        monthlyPaymentCalculated=[dd doubleValue];

self.monthlyPaymentCritical=monthlyPaymentCalculated;

те, що зроблено - це спочатку округлити його до% 0,2f і зберегти в NSString, потім я просто перетворив його знову на подвійне, і результат був хорошим для мого розрахунку.


1

Мені потрібно було мати можливість округлення до певної цифри (не обов’язково до цілих цілих чисел). Я створив NSNumberкатегорію (на основі відповіді Еша ) і додав до неї такий метод:

- (NSString *)stringByRounding:(NSNumberFormatterRoundingMode)roundingMode
      toPositionRightOfDecimal:(NSUInteger)position
{
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setMaximumFractionDigits:position];
    [formatter setRoundingMode:roundingMode];
    NSString *numberString = [formatter stringFromNumber:self];
    return numberString;
}

Що дозволяє мені використовувати його так:

[aNumber stringByRounding:NSNumberFormatterRoundUp toPositionRightOfDecimal:2];

Я можу використовувати його для округлення до цілих чисел, передавши 0як другий параметр:

[aNumber stringByRounding:NSNumberFormatterRoundPlain toPositionRightOfDecimal:0];

1

За допомогою цих функцій ви можете округлити до будь-якого значення .. Якщо ви використовуєте p = 2, ви отримуєте парні числа.

float RoundTo(float x, float p)
{
  float y = 1/p;
  return int((x+(1/(y+y)))*y)/y;
}

float RoundUp(float x, float p)
{
  float y = 1/p;
  return int((x+(1/y))*y)/y;
}

float RoundDown(float x, float p)
{
  float y = 1/p;
  return int(x*y)/y;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.