NSDecimalNumber вокруг длинных чисел
Я пытаюсь получить NSDecimalNumber для печати больших чисел, 15 или более цифр. В 15 цифрах я вижу 1111111111111111. Выше 15 цифр я вижу 1,111,111,111,111,110, хотя форматируемое число - 1111111111111111.
Пример для иллюстрации моей проблемы:
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMaximumSignificantDigits:25];
[formatter setUsesSignificantDigits:true];
NSDecimalNumber* test = [NSDecimalNumber decimalNumberWithString:@"12345678901234567890"];
NSString* output = [formatter stringFromNumber:test];
NSLog( @"num value: %@", test );
NSLog( @"str value: %@", output );
И вывод выглядит так:
2010-09-16 09:24:16.783 SimpleCalc[739:207] num value: 12345678901234567890
2010-09-16 09:24:16.784 SimpleCalc[739:207] str value: 12,345,678,901,234,600,000
Какую глупость я пропустил?
2 ответа
Проблема здесь в том, что NSNumberFormatter
не обрабатывает NSDecimalNumbers
внутренне они преобразуются в double
и вы видите полученную потерю в точности. Из документов:
Представление включает в себя целые числа, числа с плавающей запятой и двойные числа; числа с плавающей запятой и двойники могут быть отформатированы до указанной десятичной позиции.
Вы, вероятно, должны взглянуть на - (NSString *)descriptionWithLocale:(NSDictionary *)locale
метод на NSDecimalNumber
,
Или же NSDecimalString()
, Примете ваше NSDecimalNumber
(например myDecimalNumber
), извлеките NSDecimal
с помощью decimalValue
(NSDecimal decimal = [myDecimalNumber decimalValue]
) и создать NSString
с NSString *myString = NSDecimalString(decimal)
функция.