如何将 NSString 转换为 long double?

How to convert a NSString to long double?

我正在处理一个可能具有巨大价值的 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 的大小相同。也许您需要一个自定义的 class 来容纳这么大的数字。

其实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;
}

您可以使用 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 中的 return 将是 1。对于可能的错误 returns 请参阅文档(终端中的 man 3 scanf)并且您需要决定如何处理这些错误,上面的示例只是执行 NSLog.

注意:long double 的大小和精度可能因 platform/OS 版本而异。以上已经使用 Xcode 8.

在 El Capitan 和 iOS 10(仅限模拟器)上使用您的值进行了测试

HTH

你可能会这样做:

long double s = strtold(myString.UTF8String, NULL);

但是如果 sizeof(long double) 与 mag_zbc 所说的 sizeof(double) 相同,您可能仍会得到 Inf.

如果您想走 pow() 路线,powl() 需要 returns long doubles。