NSNumber floatValue pas égale à la valeur NSNumber
Question
Première publication ici. Un problème avec la méthode floatValue de NSNumber - d'une certaine manière, il renvoie un nombre imprécis. Voici le problème: je stocke un tas de NSNumbers dans un tableau, comme ceci:
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 présente une valeur de 0,04 (dans la colonne de synthèse), mais f présente une valeur de 0,0399999991. Qu'est-ce que je fais mal ici?
Merci tout le monde.
La solution
Vous n'êtes pas mal faire quoi que ce soit. Ce n'est pas un problème spécifique de NSNumber
ou CGFloat
, que ce soit. Ce quelque chose de très universel sur les nombres à virgule flottante, qui est basé sur des puissances de 2, pas de pouvoirs de dix. Vous devriez lire cet article définitif ou article de Wikipedia .
Le fait est que les nombres à virgule flottante normalisés ne peuvent représenter avec précision un nombre qui est une somme de 1/2, 1/4, 1/8, .... 1/10 n'est pas. Donc, vous ne pouvez pas représenter complètement avec précision 0,1 en utilisant des nombres à virgule flottante standard.
Si vous avez vraiment besoin d'y faire face, il y a des routines qui traitent avec des fractions rationnelles ou nombres à virgule flottante décimaux.