NSTimeInterval для читаемого NSNumber - PullRequest
       13

NSTimeInterval для читаемого NSNumber

3 голосов
/ 23 февраля 2009

NSTimeInterval == double; (например, 169.12345666663)

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

Ответы [ 7 ]

6 голосов
/ 23 февраля 2009

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

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

2 голосов
/ 29 марта 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);
}
2 голосов
/ 24 марта 2011

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];
1 голос
/ 23 февраля 2009

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

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

1 голос
/ 23 февраля 2009

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

0 голосов
/ 30 марта 2011

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

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

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

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

fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon()
0 голосов
/ 28 марта 2011

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

...