我正在处理一个可能具有巨大价值的long double
值。
有一次,我将这个数字表示为NSString
,我需要将其转换为long double
.我看到我唯一的 API 是
[myString doubleValue];
我没有看到longDoubleValue
.
尝试使用doubleValue
...
long double x = (long double)[@"3765765765E933" doubleValue];
给了我inf
,有问题的数字是一个合法的long double
值,因为这些数字可以上升到1.18973149535723176502E+4932
.
我该怎么做?
也许在 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
的大小相同。也许您需要一个自定义类来容纳如此大的数字。
你可以这样做:
long double s = strtold(myString.UTF8String, NULL);
但是,如果sizeof(long double)
与mag_zbc所说的sizeof(double)
相同,您可能仍然会得到Inf
。
如果你想走pow()
路线,有powl()
它采取和返回long double
s。
您可以使用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
的大小和精度可能因平台/操作系统版本而异。以上内容已在 El Capitan 和 iOS 10(仅限模拟器(上使用 Xcode 8 进行了测试。
呵呵
事实上,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;
}