Вопрос

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()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top