2010-05-12 41 views
2

Premier message ici. Avoir un problème avec la méthode floatValue de NSNumber - en quelque sorte, il renvoie un nombre imprécis. Voici le problème: je stocke un tas de NSNumbers dans un tableau, comme ceci:NSNumber floatValue différent de NSNumber value

NSArray *a = [NSArray arrayWithObjects: 
    [NSNumber numberWithFloat:0.04f], 
    [NSNumber numberWithFloat:0.028f], 
    [NSNumber numberWithFloat:0.016f], 
    [NSNumber numberWithFloat:0.004f], 
    nil]; 

Alors je tente de récupérer la première valeur (par exemple): NSNumber n = (NSNumber) [a objectAtIndex: 0]; CGFloat f = [n floatValue];

Dans le débogueur, n affiche une valeur de 0,04 (dans la colonne de résumé), mais f affiche une valeur de 0,0399999991. Qu'est-ce que je fais mal ici?

Merci à tous.

Répondre

2

Vous ne faites rien de mal. Ce n'est pas un problème spécifique de NSNumber ou CGFloat, soit. C'est quelque chose de très universel sur les nombres à virgule flottante, qui est basé sur des puissances de 2, pas des puissances de dix. Vous devriez lire this definitive article ou Wikipedia article. Le point est que les nombres à virgule flottante standard ne peuvent représenter avec précision qu'un nombre qui est une somme de 1/2, 1/4, 1/8, .... 1/10 ne l'est pas. Vous ne pouvez donc pas représenter exactement 0,1 avec précision en utilisant des nombres à virgule flottante standard.

Si vous avez vraiment besoin de le faire, il existe des routines qui traitent des fractions rationnelles ou des nombres décimaux à virgule flottante.

+0

Ça éclaircit, merci. En d'autres termes, ne faites jamais == des comparaisons avec des flottants sauf si vous les arrondissez en premier. Merci. – Mirkules