NSTimeInterval для читаемого NSNumber
-
05-09-2019 - |
Вопрос
NSTimeInterval == двойной;(например.169.12345666663)
Как мне округлить это двойное значение, чтобы после «точки» осталось только 2 цифры?
Было бы очень хорошо, если бы результатом был NSNumber.
Решение
Если это для наглядности, взгляните на НСНумберформаттер.
Если вы по какой-то причине действительно хотите округлить двойное число в своих расчетах, вы можете использовать стандартный C. round()
функция.
Другие советы
NSDecimal можно округлить до указанного количества цифр с помощью НСДесималРаунд().
double d = [[NSDate date] timeIntervalSince1970];
NSDecimal in = [[NSNumber numberWithDouble:d] decimalValue];
NSDecimal out;
NSDecimalRound( &out, &in, 2, NSRoundUp );
NSDecimalNumber *result = [NSDecimalNumber decimalNumberWithDecimal:out];
Если вам действительно нужно, чтобы после точки остались две цифры, умножьте на 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);
}
В подавляющем большинстве случаев округление числа следует выполнять только во время отображения.Свойства чисел с плавающей запятой (двойных или нет) делают невозможным хранение определенных чисел с фиксированной точностью.
Информацию о форматировании числа для отображения с точностью до двух десятичных знаков см. см. этот другой пост.
Означает ли это HumanReadableTimeInterval помощь?Однако он возвращает NSString.Альтернативно, вы можете округлить себя, умножив на 100, преобразуя в целое число и снова разделив на 100.
Я бы просто использовал ANSI C round()
функция.
Вы всегда можете округлить число, используя:
double round2dec(double a) { return round(a * 100) / 100; }
Но есть вероятность, что представление результата в виде двойного числа не будет содержать только 2 десятичных знака.
Теперь, если, используя знак ==, вы имели в виду, что сравнение двух ваших двойных чисел производится только до второго десятичного числа.Вот что вы можете сделать:
fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon()