12

我接受 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

4 回答 4

36
double cal = [value doubleValue] + ([value2 doubleValue] * 8) + 3;
NSString *message =[[NSString alloc] initWithFormat:@"%f",cal];
于 2010-07-21T12:38:10.683 回答
3

你不应该一直在双打和字符串之间转换,因为它往往会失去准确性(通常,如果你不想失去准确性,你必须非常小心)。

例如,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”足够了,前提是双打是 IEEE 754 64 位双打并且库工作正常,但不能保证。

归根结底,无法保证[[NSString stringWithFormat:@"%.17g",n] doubleValue] == n.

于 2010-07-21T13:09:04.733 回答
1
双倍校准 = [值 doubleValue] + ([value2 doubleValue] * 8) + 3;
NSString *message =[[NSString alloc] initWithFormat:@"%g",cal];

// 处理消息

【消息发布】;
于 2010-07-21T12:44:11.997 回答
1

发布一个新答案,因为接受的答案只做 string=>double:

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

要使用 double=>string,请使用

double cost = [string doubleValue];
于 2013-10-02T17:14:45.210 回答