3

我正在处理一个long double可以具有巨大价值的价值。

有一次,我将此数字表示为NSString,我需要将其转换为long double. 我看到我拥有的唯一 API 是

[myString doubleValue];

我没有看到longDoubleValue.

尝试使用doubleValue...转换此数字

long double x = (long double)[@"3765765765E933" doubleValue];

给我inf,有问题的数字是合法long double值,因为这些数字可以上升到1.18973149535723176502E+4932.

我怎么做?

4

4 回答 4

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

于 2017-07-07T10:54:10.907 回答
1

你可能会这样做:

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

但是如果和 mag_zbc 说sizeof(long double)的一样,你可能仍然会得到.sizeof(double)Inf

如果你想走这pow()条路线,有powl()which 取并返回long doubles。

于 2017-07-08T03:22:30.963 回答
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;
}
于 2017-07-07T13:50:45.957 回答
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(仅限模拟器)上进行了测试。

高温高压

于 2017-07-07T18:04:29.993 回答