Pergunta

NSTimeInterval == duplo; (Por exemplo 169,12345666663)

Como posso arredondar essa dupla de modo que há apenas 2 dígitos à esquerda após o "ponto"?
Seria muito bom se o resultado é um NSNumber.

Foi útil?

Solução

Se isto é para fins de exibição, dar uma olhada em NSNumberFormatter .

Se você realmente deseja arredondar o dobro em seus cálculos, por algum motivo, você pode usar a função C round() padrão.

Outras dicas

A NSDecimal pode ser arredondado para um número especificado de dígitos com NSDecimalRound () .

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

NSDecimalNumber *result = [NSDecimalNumber decimalNumberWithDecimal:out];

Se você realmente quer dois dígitos à esquerda após o ponto, multiplique por 100, redondo-lo usando a função round (), dividi-lo por 100 novamente. No entanto, isso não garante que ele realmente tem apenas dois dígitos após o ponto, uma vez que, dividindo-o novamente, você pode obter um número que realmente não pode ser expresso com flutuante notação de ponto e quando você espera 0,1 você pode de fato obter 0,09999 .. ., isso é porque você não pode realmente expressar 0,1 usando a notação de ponto flutuante.

Se você quiser apenas para arredondar para dois dígitos após o ponto para fins de exibição, você pode usar NSNumberFormatter como foi sugerido ou simplesmente use:

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

ou para obter um NSString, você também pode usar o seguinte, que é, provavelmente, ainda mais rápido do que usar um NumberFormatter (no entanto, não vai ser localizada de acordo com as preferências do usuário):

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

Na grande maioria dos casos de arredondamento um número é algo que você só deve fazer no tempo de exibição. As propriedades dos números de ponto flutuante (duplo ou não) tornam impossível para armazenar certos números com uma precisão fixa.

Para obter informações sobre a formatação de um número para ser exibida com duas casas decimais, veja este outro post .

Será que isso ajuda HumanReadableTimeInterval ? Ele retorna um NSString, no entanto. Alternativamente, você pode arredondar-se multiplicando com 100, converter para um inteiro e dividindo a 100 novamente.

Gostaria apenas de utilizar a função de round() ANSI C.

Você pode sempre ronda o número usando:

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

Mas as chances são de que a representação do resultado como uma dupla não terá apenas 2 casas decimais.

Agora, se usando o sinal ==, você quis dizer que a comparação de seus dois números de duplas é feita apenas para a segunda casa decimal. Aqui está o que você pode fazer:

fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top