Преобразуйте NSString в double для расчетов, а затем снова верните в печать в NSString - PullRequest
12 голосов
/ 21 июля 2010

Я принимаю NSString как

NSString *value = [valuelist objectAtIndex:valuerow];
NSString *value2 = [valuelist2 objectAtIndex:valuerow2];

от UIPickerView.Я хочу

double *cal = value + (value2 * 8) + 3;


NSString *message =[[NSString alloc] initWithFormat:@"%@",cal];

Я смогу получить строку в сообщении после того, как я выполню вычисления на нем .. Пожалуйста, помогите Моя программа падает

Ответы [ 4 ]

35 голосов
/ 21 июля 2010
double cal = [value doubleValue] + ([value2 doubleValue] * 8) + 3;
NSString *message =[[NSString alloc] initWithFormat:@"%f",cal];
3 голосов
/ 21 июля 2010

Вы не должны все время конвертировать между двойными и строковыми значениями, так как это имеет тенденцию терять точность (в общем, вы должны быть очень осторожными , если не хотите терять точность).

Например, nextafter(1.0,2.0) возвращает наименьшее двойное число больше 1 (ровно 1.0000000000000002220446049250313080847263336181640625, но мы довольны 1.0000000000000002).Форматирование с помощью «% g» просто возвращает «1».

Мы ожидаем, что NSNumber сделает все правильно, но [[NSNumber numberWithDouble:nextafter(1,2)] stringValue] также вернет «1».Согласно документам, -[NSNumber stringValue] вызывает [self descriptionWithLocale:nil], который форматирует его как "% 0.16g".Этого не достаточно.Мы получаем правильный ответ, отформатировав с "% .17g".Я думаю, что "% .17g" достаточно при условии, что двойники - это 64-разрядные двойники IEEE 754, а библиотеки работают нормально, но нет гарантии.

В конце концов, нет гарантии, что [[NSString stringWithFormat:@"%.17g",n] doubleValue] == n.

1 голос
/ 02 октября 2013

Отправка нового ответа, так как принятый только делает строку => double:

double cal = [value doubleValue] + ([value2 doubleValue] * 8) + 3;
NSString *message =[[NSString alloc] initWithFormat:@"%f",cal];

Чтобы набрать двойную => строку, используйте

double cost = [string doubleValue];
1 голос
/ 21 июля 2010
double cal = [value doubleValue] + ([value2 doubleValue] * 8) + 3;
NSString *message =[[NSString alloc] initWithFormat:@"%g",cal];

// do work with message

[message release];
...