Подтвердить что ты не робот

Преобразование NSString для двойных вычислений, а затем снова для печати в NSString

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

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

из UIPickerView. Я хочу

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


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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Например, 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.

Ответ 3

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

// do work with message

[message release];

Ответ 4

Проводка нового ответа, так как принятая только строка string = > double:

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

Чтобы перейти double = > string, используйте

double cost = [string doubleValue];