2010-09-16 11 views
5

Estoy tratando de obtener NSDecimalNumber para imprimir números grandes, 15 o más dígitos. En 15 dígitos veo 111,111,111,111,111. Por encima de 15 dígitos que veo 1.111.111.111.111.110 pesar de que el número que se está formateado es 1111111111111111.NSDecimalNumber redondo números largos

Un ejemplo para ilustrar mi problema:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatter setMaximumSignificantDigits:25]; 
[formatter setUsesSignificantDigits:true]; 

NSDecimalNumber* test = [NSDecimalNumber decimalNumberWithString:@"123456789"]; 

NSString* output = [formatter stringFromNumber:test]; 
NSLog(@"num value: %@", test); 
NSLog(@"str value: %@", output); 

Y la salida será similar a:

2010-09-16 09:24:16.783 SimpleCalc[739:207] num value: 123456789
2010-09-16 09:24:16.784 SimpleCalc[739:207] str value: 12,345,678,901,234,600,000 

Qué disparate tener ¿Extrañé?

Respuesta

3

El problema aquí es que NSNumberFormatter no maneja NSDecimalNumbers internamente, se convierten a double y está viendo la pérdida de precisión resultante. De los documentos:

La representación abarca enteros, flotantes y dobles; los flotantes y los dobles se pueden formatear a una posición decimal especificada.

Probablemente debería echar un vistazo al método - (NSString *)descriptionWithLocale:(NSDictionary *)locale en NSDecimalNumber.