2009-08-24 4 views
0

J'ai une instance NSNumberFormatter comme ceci:Pourquoi NSNumberFormatter n'afficherait-il pas tous les chiffres fractionnaires?

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setAlwaysShowsDecimalSeparator:NO]; 
[formatter setAllowsFloats:YES]; 
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4]; 
[formatter setMinimumFractionDigits:0]; 
[formatter setNumberStyle:kCFNumberFormatterDecimalStyle]; 

Je fournir une valeur comme celui-ci et l'imprimer:

NSNumber *number = [NSNumber numberWithFloat:4932.79661]; 
NSLog(@"%@", [formatter stringFromNumber:number]); 

Ce que je reçois est:

4,932.796

il il manque 2 chiffres. Maintenant, la chose étrange est, si je fais le nombre beaucoup plus grand, c'est-à-dire 49328324.79661, je n'aurais que 2 chiffres fractionnaires. Une idée de ce qui pourrait ne pas fonctionner avec le formateur? Dois-je explicitement lui dire d'utiliser une précision spécifique?

Répondre

1

réglage Essayez:

[formatter setMaximumFractionDigits:20]; 

rappelez-vous que les nombres à virgule flottante pourraient ne pas être 100% avec précision représentable en interne. Ainsi, par exemple, la sortie de votre programme ci-dessus serait:

4,932.79638671875 
+0

en effet cela semble aider, mais il oblige à en montrer 20 qui n'est pas toujours correct. Je me demande comment les calculateurs-développeurs et d'autres gars font cela, montrant de beaux nombres à virgule flottante avec autant de précision que nécessaire individuellement à ce qui veut être affiché. –

+0

Les calculatrices ont généralement un nombre fixe de caractères qu'elles peuvent afficher. Assurément, ils définiraient simplement ce nombre sur le nombre de caractères qu'ils pourraient éventuellement afficher et ensuite, une fois que la valeur est dans une chaîne, coupez simplement la fin. – rein

0

Je ne suis pas un expert ici mais je crois que les flotteurs sont limités à 7 chiffres significatifs. Vous avez 9. Quelqu'un peut me corriger si je me trompe. Vous pouvez utiliser un double ou mieux un NSDecimalNumber et ne le créez pas à partir d'un flottant mais de l'un des autres initialiseurs. Peut-être decimalNumberWithString ou decimalNumberWithDecimal.

+0

merci, ça sonne bien. En fait, la valeur que j'ai est une sorte de valeur calculée. Je pourrais changer tous les calculs pour utiliser le double. Cela aiderait-il? –

Questions connexes