如何将 NSString 转换为长双精度?



我正在处理一个可能具有巨大价值的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 doubles。

您可以使用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;
}

最新更新