Question

NSTimeInterval == doubles; (Par exemple 169,12345666663)

Comment puis-je ce double tour d'horizon de sorte qu'il n'y a que deux chiffres à la fin du « point »?
Il serait très bien si le résultat est un NSNumber.

Était-ce utile?

La solution

Si cela est à des fins d'affichage, jetez un oeil à NSNumberFormatter .

Si vous voulez vraiment arrondir la double dans vos calculs pour une raison quelconque, vous pouvez utiliser la fonction standard C round().

Autres conseils

A NSDecimal peut être arrondie à un nombre spécifié de chiffres avec 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 vous voulez vraiment deux chiffres de gauche après le point, multiplier par 100, autour d'elle en utilisant round () fonction, diviser par 100 à nouveau. Toutefois, cela ne garantit pas qu'il a vraiment que deux chiffres après le point, car en le divisant à nouveau, vous pouvez obtenir un numéro qui ne peut pas vraiment être exprimé avec la notation à virgule flottante et quand vous attendez 0.1, vous pouvez en effet obtenir 0,09999 .. ., c'est parce que vous ne pouvez pas vraiment exprimer 0.1 en utilisant la notation à virgule flottante.

Si vous voulez juste arrondir à deux chiffres après le point à des fins d'affichage, vous pouvez utiliser NSNumberFormatter comme cela a été suggéré ou simplement utiliser:

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

ou pour obtenir un NSString, vous pouvez également utiliser ce qui suit, ce qui est probablement encore plus rapide que d'utiliser un NumberFormatter (cependant, il ne sera pas localisé selon les prefs utilisateur):

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

Dans la grande majorité des cas, un certain nombre d'arrondissement est quelque chose que vous devriez faire au moment de l'affichage. Les propriétés des nombres à virgule flottante (double ou non), il est impossible de stocker certains numéros à une précision fixe.

Pour plus d'informations sur le formatage d'un numéro afin qu'il affiche à deux décimales, voir cet autre message .

HumanReadableTimeInterval d'aide? Il retourne une NSString, cependant. Sinon, vous pouvez vous arrondir en multipliant avec 100, la conversion à un entier et en divisant par 100 à nouveau.

Je voudrais simplement utiliser la fonction ANSI C round().

Vous pouvez toujours autour du numéro à l'aide:

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

Mais les chances sont que la représentation du résultat en tant que double aura pas seulement deux décimales.

Maintenant, si en utilisant le signe ==, vous vouliez dire que la comparaison de vos deux numéros doubles est faite uniquement à la deuxième décimale. Voici ce que vous pouvez faire:

fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top