2009-02-22 8 views
3

NSTimeInterval == double; (par exemple 169.12345666663)NSTimeInterval lisible NSNumber

Comment arrondir ce double de sorte qu'il ne reste que 2 chiffres après le "point"?
Ce serait très bien si le résultat est un NSNumber.

Répondre

6

Si ceci 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().

1

Est-ce que cela aide HumanReadableTimeInterval? Il renvoie un NSString, cependant. Vous pouvez également vous arrondir en multipliant par 100, en convertissant en nombre entier et en divisant par 100 à nouveau.

1

Dans la grande majorité des cas, arrondir un nombre est quelque chose que vous ne devriez faire que lors de l'affichage. Les propriétés des nombres à virgule flottante (doubles ou non) rendent impossible le stockage de certains nombres à une précision fixe.

Pour plus d'informations sur le formatage d'un numéro afin qu'il affiche à deux décimales, see this other post.

2

Un NSDecimal peut être arrondi à 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]; 
0

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

2

Si vous voulez vraiment deux chiffres à gauche après le point, multipliez par 100, arrondissez-le en utilisant la fonction round(), divisez-le par 100 à nouveau. Cependant, cela ne garantira pas qu'il a vraiment deux chiffres après le point, car en le divisant à nouveau, vous pouvez obtenir un nombre qui ne peut pas vraiment être exprimé avec la notation en virgule flottante et quand vous attendez 0,1, vous pouvez en fait obtenir 0,09999. ., parce que vous ne pouvez pas vraiment exprimer 0.1 en utilisant la notation en 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); 
} 
0

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 n'aura pas seulement 2 décimales. Maintenant, si en utilisant le signe ==, vous vouliez dire que la comparaison de vos deux nombres doubles est faite seulement à la deuxième décimale. Voici ce que vous pouvez faire:

fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon() 
Questions connexes