Pregunta

NSTimeInterval == doble; (Por ejemplo 169,12345666663)

¿Cómo puede redondear hasta que este doble por lo que sólo hay 2 dígitos después de la "punto"?
Sería muy bueno si el resultado es una NSNumber.

¿Fue útil?

Solución

Si esto es para fines de visualización, echar un vistazo a NSNumberFormatter .

Si realmente desea redondear el doble en sus cálculos, por alguna razón, puede utilizar la función C round() estándar.

Otros consejos

A NSDecimal puede redondearse a un número especificado de dígitos 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];

Si realmente quiere dos dígitos después del punto, se multiplica por 100, alrededor de ella utilizando la función round (), se divide por 100 de nuevo. Sin embargo, esto no garantiza que realmente sólo tiene dos dígitos después del punto, ya que al dividir de nuevo, es posible obtener un número que no se pueden expresar con la flotación de la notación de punto y cuando se espera que 0,1 es posible que en realidad se trata 0,09999 .. ., eso es porque realmente no se puede expresar 0,1 usando la notación de punto flotante.

Si lo que desea es lo redondea a dos dígitos después del punto para fines de visualización, puede utilizar NSNumberFormatter como se ha sugerido o simplemente utilizar:

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

o para obtener un NSString, también se puede utilizar el siguiente, que es probablemente incluso más rápido que el uso de un NumberFormatter (sin embargo, no va a ser localizada de acuerdo con las preferencias del usuario):

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

En la gran mayoría de los casos de redondeo un número es algo que sólo se debe hacer en el tiempo de visualización. Las propiedades de los números de punto flotante (dobles o no) hacen que sea imposible para almacenar ciertos números a la precisión fijo.

Para obtener información sobre el formato de un número por lo que muestra a dos cifras decimales, ver este otro post .

¿Esto HumanReadableTimeInterval ayuda? Devuelve un NSString, sin embargo. Alternativamente, se puede redondear a sí mismo mediante la multiplicación con 100, la conversión a un número entero y dividiendo a través de 100 de nuevo.

Me acaba de utilizar la función round() ANSI C.

Siempre se puede redondea el número usando:

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

Sin embargo, lo más probable es que la representación del resultado como un doble no tendrá sólo 2 decimales.

Ahora, si mediante el uso de la señal ==, que quería decir que la comparación de los dos números dobles se hace sólo para el segundo decimal. Esto es lo que puede hacer:

fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top