NSDecimalNumber вокруг длинных чисел - PullRequest
5 голосов
/ 16 сентября 2010

Я пытаюсь получить 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 ]

3 голосов
/ 13 марта 2012

Проблема здесь в том, что NSNumberFormatter не обрабатывает NSDecimalNumbers внутренне, они преобразуются в double, и вы видите полученную потерю в точности. Из документов:

Представление включает в себя целые числа, числа с плавающей запятой и двойные числа; числа с плавающей запятой и двойники могут быть отформатированы до указанной десятичной позиции.

Возможно, вам стоит взглянуть на метод - (NSString *)descriptionWithLocale:(NSDictionary *)locale в NSDecimalNumber.

0 голосов
/ 16 декабря 2014

или NSDecimalString().Возьмите NSDecimalNumber (например, myDecimalNumber), извлеките NSDecimal через decimalValue (NSDecimal decimal = [myDecimalNumber decimalValue]) и создайте NSString с функцией NSString *myString = NSDecimalString(decimal).

https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/index.html#//apple_ref/c/func/NSDecimalString

...