为何NSString的floatValue方法对"NaN"返回0而非NaN?
NSString的floatValue/doubleValue处理"NaN"返回0而非NaN的原因
- 这不是编译器设置导致的,完全是Foundation框架中NSString数值转换方法的设计逻辑问题。
- NSString的
floatValue、doubleValue方法仅支持解析标准十进制格式的字符串,对于"NaN"、"Infinity"这类IEEE 754标准定义的特殊浮点值的字符串表示,这些方法不会做识别,解析失败时就默认返回0。 - 而Swift的
Float/Double初始化器是基于符合IEEE 754标准的浮点解析逻辑实现的,因此能正确识别"NaN"并返回对应的特殊浮点值。
Objective-C中正确解析"NaN"的方法
方法1:使用标准C函数
// 解析double类型的NaN const char *str = [@"NaN" UTF8String]; double dValue = strtod(str, NULL); // 解析float类型的NaN float fValue = strtof(str, NULL);
方法2:使用NSNumberFormatter
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; formatter.allowsFloats = YES; // 必须使用POSIX locale避免区域设置影响解析 formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]; NSNumber *number = [formatter numberFromString:@"NaN"]; double dValue = [number doubleValue]; float fValue = [number floatValue];
内容的提问来源于stack exchange,提问作者Udo
相关产品推荐
相关产品推荐

