如何将NSString转换为long double?

时间:2017-07-07 10:20:03

标签: ios cocoa nsstring double 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

我该怎么做?

4 个答案:

答案 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 doubledouble的大小相同。也许你需要一个自定义类来保存这么大的数字。

答案 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