2015-03-09 3 views
0

Я пытаюсь преобразовать NSString в NSNumber и, кажется, создает здесь десятичную точку.NSNumber numberFromString не поставил десятичные знаки

NSString *str = @"515.51515"; 

NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; 
[f setNumberStyle:NSNumberFormatterDecimalStyle]; 
NSNumber * myNumber = [f numberFromString:str]; 
NSLog(@"Number here:%@",myNumber); 
[f release]; 

& результат печати 2015-03-01 08: 09: 28,353 MYAPP [57376: 2086924] Количество здесь: 515,5151499999999

Actual отлаживать журнал картина здесь

enter image description here

, но на самом деле это должно быть 515.51515 скорее 515. 5151499999999.

Я пробовал все принадлежности к f.usesSignificantDigits & f.maximumFractionDigits = 10, но не повезло.
, пожалуйста, дайте мне знать Как это исправить?

+2

То, что вы видите, это правильно. Числа с плавающей запятой редко бывают точными. – rmaddy

+0

, если вы хотите увидеть форматированный результат, вам может понадобиться явно использовать форматирование на 'double', например, например. '% .6f' или около того. – holex

+0

Есть ли причина не использовать NSDecimalNumber? https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDecimalNumber_Class/ –

ответ

1

RMaddy верен, цифры с плавающей запятой будут немного разряжены.

Поскольку NSDecimalNumber является NSNumber вы можете использовать:

NSNumber *number = [NSDecimalNumber decimalNumberWithString:@"515.51515"]; 
+0

спасибо, он работает – Manoj

0

Попробуйте использовать конструкцию:

NSNumber *myNumber = [NSNumber numberWithFloat:[str floatValue]]; 

Я думаю, он должен работать правильно.

+0

Не думайте, что он «должен» работать правильно. Попробуйте и убедитесь. Вряд ли этот ответ даст другой результат для строки, помещенной в вопросе. – rmaddy

+0

Я тестировал его, и он работал правильно. –

+1

Для меня это действительно не работает, я получаю 515.5151 без последних 5 (?). Более интересно, почему это сработает. Если вы измените numberWithFloat на numberWithDouble, он снова будет терпеть неудачу с более высокой точностью. Также может быть, что вы получаете разные результаты в 64-битной 32-битной архитектуре, так как CGFloat вводится в double на 64 и float на 32. –

Смежные вопросы