Ответ 1
double cal = [value doubleValue] + ([value2 doubleValue] * 8) + 3;
NSString *message =[[NSString alloc] initWithFormat:@"%f",cal];
Я принимаю NSString как
NSString *value = [valuelist objectAtIndex:valuerow];
NSString *value2 = [valuelist2 objectAtIndex:valuerow2];
из UIPickerView. Я хочу
double *cal = value + (value2 * 8) + 3;
NSString *message =[[NSString alloc] initWithFormat:@"%@",cal];
Я могу получить строку в сообщении после того, как сделаю расчеты на ней. Пожалуйста, помогите Моя программа сбой
double cal = [value doubleValue] + ([value2 doubleValue] * 8) + 3;
NSString *message =[[NSString alloc] initWithFormat:@"%f",cal];
Вы не должны постоянно конвертировать между удвоениями и строками, поскольку он имеет тенденцию терять точность (в общем, вы должны быть очень осторожны, если не хотите потерять точность).
Например, 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
.
double cal = [value doubleValue] + ([value2 doubleValue] * 8) + 3; NSString *message =[[NSString alloc] initWithFormat:@"%g",cal]; // do work with message [message release];
Проводка нового ответа, так как принятая только строка string = > double:
double cal = [value doubleValue] + ([value2 doubleValue] * 8) + 3;
NSString *message =[[NSString alloc] initWithFormat:@"%f",cal];
Чтобы перейти double = > string, используйте
double cost = [string doubleValue];