Храните NSNumber в длинном двойном типе - PullRequest
3 голосов
/ 27 июня 2011

У меня есть номер, сохраненный в NSNumber, который я хотел бы поместить в long double, вот так:

NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; 

[f setNumberStyle:NSNumberFormatterDecimalStyle]; 

[f setMinimumSignificantDigits:5];

NSNumber * myNumber = [f numberFromString:@"1.1234567899"]; 

long double lnumber = mynumber;
NSLog(@"%Lf ",lnumber);

Ответы [ 5 ]

10 голосов
/ 27 июня 2011

An NSNumber является объектом Objective-C, а long double является примитивным типом. Вы не можете присвоить объект переменной примитивного типа. Если вам нужно числовое значение, которое хранится в NSNumber, вам нужно использовать один из его методов для его получения:

long double lnumber = [myNumber doubleValue];

Нет условия для хранения long double в NSNumber; самый большой тип с плавающей точкой просто double. Похоже, что long double может иметь тот же размер, что и double на iOS в любом случае: см. Эту ветку форума поддержки Apple .

Как и ThomasW упомянул , NSDecimalNumber, класс чисел с фиксированной точкой, предлагает как большую точность (до 38 цифр), так и точность, чем NSNumber. Тем не менее, до сих пор нет способа получить long double; вам придется делать всю математику только с NSDecimalNumber s, чтобы сохранить точность.

В заголовке вашего вопроса также упоминалось NSInteger, хотя в теле нет, поэтому позвольте мне добавить эту заметку. NSInteger - это примитивный тип, такой как long double, так что вы можете фактически назначать один другому.

NSInteger myInteger = 10000;
long double lnumer = myInteger;

Однако, поскольку это целое число, оно не может иметь дробной части.

2 голосов
/ 27 июня 2011

Насколько я знаю, лучшее, что вы получите, - это двойное значение.

long double lnumber = [mynumber doubleValue];

Вы также можете сделать это, если значение в строке начинается с

NSString* sval = @"1.1234567";
double dval = [sval doubleValue];
1 голос
/ 27 июня 2011

К сожалению, вы не можете. Как говорит NSNumber Class Reference , NSNumber поддерживает double и float, но не long double.

0 голосов
/ 23 июня 2013

Попробуйте разыграть число:

long double lnumber = (long double) mynumber;
0 голосов
/ 27 июня 2011

Если вам нужна высокая точность, вы можете использовать NSDecimalNumber, но она также не поддерживает long double.

http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSDecimalNumber_Class/Reference/Reference.html

...