我正在处理可能具有巨大价值的long double
值。
我曾经将这个数字表示为NSString
,我需要将其转换为long double
。我看到我唯一拥有的API是
[myString doubleValue];
我没有看到longDoubleValue
。
尝试使用doubleValue
...
long double x = (long double)[@"3765765765E933" doubleValue];
给我inf
,有问题的数字是合法的long double
值,因为这些数字可以达到1.18973149535723176502E+4932
。
我该怎么做?
答案 0 :(得分:2)
也许自己在NSString上创建一个类别
NSArray *array = [myString componentsSeparatedByString:@"E"];
long double mantis = (long double)[array[0] doubleValue];
long double exponent = (long double)[array[1] doubleValue];
return mantis * exponent;
虽然
可能会丢失数据 修改强>
似乎iOS上的long double
与double
的大小相同。也许你需要一个自定义类来保存这么大的数字。
答案 1 :(得分:1)
你可能会这样做:
long double s = strtold(myString.UTF8String, NULL);
但如果sizeof(long double)
与mag_zbc所说的sizeof(double)
相同,您可能仍会获得Inf
。
如果您想转到pow()
路线,则会powl()
接收并返回long double
。
答案 2 :(得分:0)
事实上,mag_zbc
的答案几乎就在那里。最后一行不正确。
考虑到字符串有指数,正确的是:
- (long double)longDoubleValue {
NSArray *array = [string componentsSeparatedByString:@"E"];
long double mantis = (long double)[array[0] doubleValue];
long double exponent = (long double)[array[1] doubleValue];
long double multiplier = powl(10.0L, exponent);
return mantis * multiplier;
}
答案 3 :(得分:0)
您可以使用C库sscanf
功能执行此操作。这是一个Objective-C包装器示例:
long double stringToLongDouble(NSString *str)
{
long double result = 0.0L;
int ret = sscanf(str.UTF8String, "%Lg", &result);
if (ret != 1)
{
// Insert your own error handling here, using NSLog for demo
NSLog(@"stringToLongDouble: could not parse '%@' as long double", str);
return 0.0L;
}
return result;
}
如果成功,sscanf
的回复将为1
。有关可能的错误返回,请参阅文档(终端中的man 3 scanf
),您需要决定如何处理这些内容,上面的示例只执行NSLog
。
注意:尺寸& long double
的精度可能因平台/操作系统版本而异。上面的内容已经使用Xcode 8在El Capitan和iOS 10(仅限模拟器)上进行了测试。
HTH