如何将 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 double
s。
我正在处理一个可能具有巨大价值的 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.
HTH
你可能会这样做:
long double s = strtold(myString.UTF8String, NULL);
但是如果 sizeof(long double)
与 mag_zbc 所说的 sizeof(double)
相同,您可能仍会得到 Inf
.
如果您想走 pow()
路线,powl()
需要 returns long double
s。