2009-03-31 13 views
2

Ich versuche, große Währungs Zahlen wie folgt zu formatieren:Wie kann ich das Runden von iPhone NSNumberFormatter verhindern?

NSNumber *testVal = [NSDecimalNumber decimalNumberWithString: @"999999999999999993.00"]; 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 
[formatter setMaximumIntegerDigits:19]; 
[formatter setMaximumFractionDigits:0]; 
NSNumberFormatter *formatter = [Formatters numberFormatterForField:f]; 
NSLog([formatter stringFromNumber:testVal]); 

für einen Moment die Wirkung von Locale Ignorieren, finde ich, dass ich die folgende Ausgabe unabhängig von der Rundung konsequent erhalten:

1,000,000,000,000,000,000 

erwarte ich:

999,999,999,999,999,993 

ich habe versucht, die Rundung ohne Wirkung zu ändern. Warum besteht NSNumberFormatter auf Abrundung?

Antwort

4

NSNumberFormatter konvertiert die Zahl vor der Anzeige in ein Double, das ist also nicht das, was Sie wollen. NSDecimalNumber hat eine descriptionWithLocale: Methode, die Ihren Bedürfnissen entsprechen sollte.

Siehe diese Antwort: link

+0

Eigentlich in meinem ursprünglichen Code bin ich ein Doppel gegeben und brauche das zu formatieren. Ich hatte gerade versucht, NSDecimalNumber zu versuchen, um zu sehen, ob es einen Unterschied machte (und es nicht tut). Ich denke, es gibt keine Möglichkeit, diesen Präzisionsverlust zu vermeiden, wenn NSNumberFormatter von einem Double in eine Zeichenfolge konvertiert? – thrusty

+0

Doubles haben nur ungefähr 17-18 Dezimalstellen der Genauigkeit, mit zu beginnen: http://cboard.cprogramming.com/c-programming/93742-extended-vs-double-precision.html NSNumberFormatter kann nicht die Information wieder herstellen, die bereits verloren worden ist – rpetrich

Verwandte Themen