Pourquoi uitextfield.text renvoie-t-il le numéro de flotteur exact lorsqu'il est récupéré à partir d'un tableau?

StackOverflow https://stackoverflow.com/questions/19825257

Question

J'ai un tableau qui stocke TextField.Text Entrée. Je récupére ensuite le texte ailleurs comme un flotteur. Cela semble me donner le «numéro exact» du champ de texte.

Exemple A

   navtestAppDelegate *appDelegate = 
   (navtestAppDelegate *)[[UIApplication 
    sharedApplication] delegate];

NSMutableArray *storedData = 
 appDelegate.myData;

[storedData replaceObjectAtIndex: myIndex withObject: mytextfield.text];

float number = [[storedData objectAtIndex:myIndex] floatValue];

si mytextfield.text input is 22.8, float number Retour 22.8

cependant,

Exemple B

[storedData replaceObjectAtIndex: myIndex withObject: @"22.8”];

float number  = [[storedData objectAtIndex:myIndex] floatValue];

float number Retour 22.7999999

Je ne comprends pas pourquoi j'obtiens le numéro exact dans l'exemple A

Était-ce utile?

La solution

La valeur 22.8 ne peut pas être représentée exactement au point flottant binaire. Ce que vous voyez, c'est une représentation basée sur le format d'affichage. Différentes méthodes d'affichage peuvent utiliser différents formats d'affichage. L'affichage de différents chiffres et l'arrondi signifie que les 22,8 et 22.7999999 sont corrects pour le nombre de chiffres affichés après l'arrondi. Notez que 22.7999999 a été affiché et non 22.8000000 car le chiffre suivant était 2, donc la valeur affichée a été arrondie.

Ceci dépend de la base, c'est-à-dire des choses qui peuvent être exactes dans une base de nombres peuvent ne pas être exactes dans une base numérique différente. Dans ce cas, 22.8 dans la base de numéros décimaux ne peut pas être exact dans la base du nombre binaire.

C'est la raison pour laquelle nsdecimal existe et la raison pour laquelle le point flottant n'est pas utilisé pour les valeurs monétaires.

Ceci est quelque peu équivalent à l'affichage de la valeur de Pi en décimal de base, le nombre de chiffres est infini, donc pour chaque affichage quelqu'un a décidé du nombre de chiffres à montrer. Fait intéressant, PI peut être représenté exactement (mais utilement) dans la base du nombre PI. :-)

Dans le cas de float et double Il y a un nombre fini de chiffres qui peuvent être représentés.

Autres conseils

Essayez comme ceci: -

[storedData replaceObjectAtIndex: myIndex    
 withObject: [NSNumber 
 numberWithFloat:22.8]];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top