Je suis venu un comportement étrange de NSNumber
.NSNumber n'est pas le même que son floatValue
essentiellement mon code obtient JSON appel API:
id json_response = [NSJSONSerialization
JSONObjectWithData:data
options:NSJSONReadingMutableLeaves
error:&error];
et stocké NSDictionary
puis je me suis NSNumber
de et en utilisant NSNumberFormatter
pour le convertir en une chaîne, mais ...
NSNumber * avgNumber = [[_tableDataArray objectAtIndex:index ]
objectForKey:kTrendsKeyAvgScoreFloat];
est ici la sortie de formatage:
NSNumberFormatter * formatter = [[NSNumberFormatter alloc]init];
[formatter setDecimalSeparator:@","];
[formatter setMaximumFractionDigits:1];
[formatter setMinimumFractionDigits:0];
[formatter setGroupingSeparator:@"."];
[formatter setGroupingSize:3];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSString * retString = [formatter stringFromNumber:number];
je suis arrivé un comportement étrange quand NSNumber
a une valeur de 1,05
(__NSCFNumber *) avgNumber = 0x0000000155923800 (float)1.050000
Mais avec le code ci-dessus, il a été l'impression (au lieu de prévu 1.1):
1
Cependant, lorsque j'ai vérifié valeur flottante
float avg = [avgNumber floatValue];
il s'avère que
Printing description of avg:
(double) avg = 1.0499999523162842
Même si j'essaie d'arrondir à 2 chiffres après la virgule
avg = roundf(avg * 100); // here 105
avg = avg/100; // and here is 1.0499999523162842 again
Toutefois, si je teste le code et mis 1,05 manuellement à l'intérieur NSDictionary
tout fonctionne comme prévu.
Si quelqu'un pouvait expliquer pourquoi? Et comment préserver chaque fois bon affichage?
Ce n'est pas clair quel est votre problème. Est-ce que 'NSNumberFormatter' produit' 1' au lieu de '1.1'? Dans ce cas, c'est parce qu'il arrondit vers le bas. Ou êtes-vous confus par le nombre étant «1.04999» au lieu de «1.05»? Dans ce cas, c'est juste une erreur d'arrondi à virgule flottante. – trojanfoe
http://floating-point-gui.de –
Oui, je suis confus parce que j'ai 1.05 et il devrait être arrondi à 1.1 pas 1. – mazziek