2009-08-24 17 views
0

Ich habe eine NSNumberFormatter Beispiel wie folgt aus:Warum zeigt NSNumberFormatter nicht alle Nachkommastellen an?

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

Dann stelle ich einen Wert wie diese und ausdrucken:

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

Was ich erhalte, ist: es

4,932.796

fehlen 2 Ziffern. Jetzt ist das merkwürdige Ding, wenn ich die Zahl viel größer mache, d. H. 49328324.79661, würde ich nur 2 Nachkommastellen bekommen. Irgendeine Idee, was mit dem Formatierer falsch sein könnte? Muss ich es ausdrücklich sagen, um eine bestimmte Präzision zu verwenden?

Antwort

1

Try Einstellung:

[formatter setMaximumFractionDigits:20]; 

daran erinnern, dass Gleitkommazahlen intern nicht 100% genau darstellbar sein könnte. So wäre zum Beispiel die Ausgabe von Ihrem Programm oben:

4,932.79638671875 
+0

tatsächlich scheint das zu helfen, aber es zwingt 20 von ihnen zu zeigen, was nicht immer korrekt ist. Ich frage mich, wie Taschenrechner-Entwickler und andere das machen, indem sie formatierte Fließkomma-Zahlen mit nur so viel Präzision zeigen, wie sie einzeln benötigt werden, um das darzustellen, was angezeigt werden soll. –

+0

Taschenrechner haben normalerweise eine feste Anzahl von Zeichen, die sie anzeigen können. Sicher würden sie diese Zahl auf die Anzahl der Zeichen setzen, die sie möglicherweise anzeigen könnten, und dann, sobald der Wert in einer Zeichenfolge ist, schneiden Sie einfach das Ende ab. – rein

0

Ich bin kein Experte hier, aber ich glaube, Schwimmer sind auf 7 signifikante Ziffern begrenzt. Sie haben 9. Jemand kann mich korrigieren, wenn ich falsch liege. Sie könnten eine doppelte oder besser noch eine NSDecimalNumber verwenden und nicht aus einem Float, sondern von einem der anderen Initialisierer erstellen. Vielleicht decimalNumberWithString oder decimalNumberWithDecimal.

+0

danke, das klingt gut. Nun, eigentlich ist der Wert, den ich habe, eine Art kalkulierter Wert. Ich könnte alle Berechnungen auf Double umstellen. Würde das helfen? –

Verwandte Themen