Domanda

NSTimeInterval == doppia; (Ad esempio 169,12345666663)

Come posso arrotondare questa doppia in modo che ci sono solo 2 cifre a sinistra dopo il "punto"?
Sarebbe molto bello se il risultato è un NSNumber.

È stato utile?

Soluzione

Se questo è per scopi di visualizzazione, un'occhiata a NSNumberFormatter .

Se si vuole veramente per arrotondare il doppio nei calcoli per qualche motivo, è possibile utilizzare la funzione di C round() standard.

Altri suggerimenti

A NSDecimal può essere arrotondato a un numero specificato di cifre con 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 si vuole veramente due cifre a sinistra dopo il punto, moltiplicare per 100, intorno ad essa tramite la funzione rotonda (), dividerlo per 100 di nuovo. Tuttavia, questo non garantisce che essa ha in realtà solo due cifre dopo il punto, in quanto dividendo di nuovo, è possibile ottenere un numero che non può davvero essere espresso con virgola mobile notazione e quando ci si aspetta 0,1 si può infatti ottenere 0,09,999 mila .. ., è perché non si può davvero esprimere 0.1 utilizzando la notazione in virgola mobile.

Se si desidera solo per arrotondare a due cifre dopo il punto per la visualizzazione, è possibile utilizzare NSNumberFormatter come è stato suggerito o semplicemente usare:

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

o per ottenere un NSString, è anche possibile utilizzare il seguente, che è probabilmente ancora più veloce rispetto all'utilizzo di un NumberFormatter (tuttavia, non sarà localizzato in base alle preferenze dell'utente):

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

Nella stragrande maggioranza dei casi di arrotondamento un numero è qualcosa che si dovrebbe fare solo in fase di visualizzazione. Le proprietà di numeri in virgola mobile (doppie o meno) rendono impossibile memorizzare alcuni numeri a precisione fissa.

Per informazioni sulla formattazione di un numero in modo da visualizzare a due cifre decimali, vedere questo altro post .

HumanReadableTimeInterval aiuto? Esso restituisce un NSString, però. In alternativa, si può arrotondare stessi moltiplicando con 100, la conversione in un numero intero e dividendo per 100 di nuovo.

Vorrei solo usare la funzione round() ANSI C.

Si può sempre intorno al numero utilizzando:

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

Ma le probabilità sono che la rappresentazione del risultato come un doppio, non avrà solo 2 decimali.

Ora, se utilizzando il segno ==, volevi dire che il confronto tra i due numeri doppi è fatta solo al secondo decimale. Ecco cosa si può fare:

fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top