NSTimeInterval в читаемый NSNumber

NSTimeInterval == двойной; (например, 169.12345666663)

Как мне округлить это число в два раза, чтобы после «точки» оставались только 2 цифры?
Было бы очень хорошо, если бы результатом было NSNumber.


person papr    schedule 22.02.2009    source источник


Ответы (7)


Если это необходимо для отображения, взгляните на NSNumberFormatter.

Если по какой-то причине вы действительно хотите округлить число в два раза, вы можете использовать стандартную функцию C round().

person Chuck    schedule 22.02.2009

NSDecimal можно округлить до указанного количества цифр с помощью NSDecimalRound ().

double d = [[NSDate date] timeIntervalSince1970];
NSDecimal in = [[NSNumber numberWithDouble:d] decimalValue];
NSDecimal out;
NSDecimalRound( &out, &in, 2, NSRoundUp );

NSDecimalNumber *result = [NSDecimalNumber decimalNumberWithDecimal:out];
person Lachlan Roche    schedule 24.03.2011

Если вам действительно нужны две цифры, оставшиеся после точки, умножьте на 100, округлите с помощью функции round (), снова разделите на 100. Однако это не гарантирует, что на самом деле у него только две цифры после точки, поскольку, разделив его снова, вы можете получить число, которое на самом деле не может быть выражено с помощью нотации с плавающей запятой, и когда вы ожидаете 0,1, вы фактически можете получить 0,09999 .. ., это потому, что вы не можете выразить 0,1, используя нотацию с плавающей запятой.

Если вы просто хотите округлить его до двух цифр после точки для отображения, вы можете использовать NSNumberFormatter, как было предложено, или просто использовать:

printf("%.2f\n", yourTimeInterval);
NSLog(@"%.2f\n", yourTimeInterval);

или чтобы получить NSString, вы также можете использовать следующее, что, вероятно, даже быстрее, чем использование NumberFormatter (однако оно не будет локализовано в соответствии с пользовательскими настройками):

NSString * intervalStr = nil;
char * intervalStrTmp = NULL;
asprintf(&intervalStrTmp, "%.2f", yourTimeInteval);
if (intervalStrTmp) {
  intervalStr = [[NSString alloc] initWithUTF8String:intervalStrTmp];
  free(intervalStrTmp);
}
person Mecki    schedule 29.03.2011

В подавляющем большинстве случаев округление числа - это то, что вам следует делать только во время отображения. Свойства чисел с плавающей запятой (double или not) делают невозможным сохранение определенных чисел с фиксированной точностью.

Для получения информации о форматировании числа таким образом, чтобы оно отображалось до двух десятичных знаков, см. другой пост.

person Andrew Grant    schedule 22.02.2009

Помогает ли этот HumanReadableTimeInterval? Однако он возвращает NSString. Кроме того, вы можете округлить себя, умножив на 100, преобразовав в целое число и снова разделив на 100.

person schnaader    schedule 22.02.2009

Я бы просто использовал функцию ANSI C round().

person champak256    schedule 28.03.2011

Вы всегда можете округлить число, используя:

double round2dec(double a) { return round(a * 100) / 100; }

Но есть вероятность, что представление результата как двойное не будет иметь только 2 десятичных знака.

Теперь, если, используя знак ==, вы имели в виду, что сравнение ваших двух двойных чисел производится только до второго десятичного знака. Вот что можно сделать:

fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon()
person Alex Reche Martinez    schedule 30.03.2011