问题:在项目中使用AFNetworking解析数据时,有时会出现浮点数小数点精度丢失的情况。
例如: 正常情况下,后台返回数据是 :39.90 ,在iOS 端解析后,数据会显示 :39.9000000001 的情况。
解决办法: 对解析过后的浮点字符串进行修正, 修正方法如下:
+(NSDecimalNumber *)reviseNum:(NSNumber *)tmpNum{
double tmpValue = [tmpNum doubleValue];
NSString * tmpDoubleStr = [NSString stringWithFormat:@"%lf",tmpValue];
NSDecimalNumber * tmpNumber = [NSDecimalNumber decimalNumberWithString:tmpDoubleStr];
return tmpNumber;
}
对于返回数据中出现大量 小数点精度丢失的情况,可以对以上方法进行分装,在数据返回时直接处理,方法如下:
#pragma mark -- 小数点精度丢失问题处理
+(NSMutableDictionary *)setDecimalPointPrecisionProcessing:(NSMutableDictionary *)tmpDict{
if(tmpDict){
return [self setParseDict:tmpDict];
}
return nil;
}
+(NSMutableDictionary *)setParseDict:(NSMutableDictionary *)dict{
NSArray * allKeys = [dict allKeys];
for (int i = 0; i<allKeys.count; i++) {
NSString * tmpKey = allKeys[i];
id tmpValue = dict[tmpKey];
if([tmpValue isKindOfClass:[NSNumber class]]){
[dict setObject:[self reviseNum:tmpValue] forKey:tmpKey];
}else if ([tmpValue isKindOfClass:[NSArray class]]){
NSMutableArray * arr = [NSMutableArray arrayWithArray:tmpValue];
[dict setObject:[self setParseArray:arr] forKey:tmpKey];
}else if ([tmpValue isKindOfClass:[NSDictionary class]]){
NSMutableDictionary * dic = [NSMutableDictionary dictionaryWithDictionary:tmpValue];
[dict setObject:[self setParseDict:dic] forKey:tmpKey];
}
}
return dict;
}
+(NSMutableArray *)setParseArray:(NSMutableArray *)tmpArr{
for (int i = 0; i < tmpArr.count; i++) {
id tmpValue = tmpArr[i];
if([tmpValue isKindOfClass:[NSNumber class]]){
[tmpArr replaceObjectAtIndex:i withObject:[self setPareseNumber:tmpValue]];
}else if ([tmpValue isKindOfClass:[NSArray class]]){
NSMutableArray * arr = [NSMutableArray arrayWithArray:tmpValue];
[tmpArr replaceObjectAtIndex:i withObject:[self setParseArray:arr]];
}else if ([tmpValue isKindOfClass:[NSDictionary class]]){
NSMutableDictionary * dic = [NSMutableDictionary dictionaryWithDictionary:tmpValue];
[tmpArr replaceObjectAtIndex:i withObject:[self setParseDict:dic]];
}
}
return tmpArr;
}
+(NSDecimalNumber *)setPareseNumber:(NSNumber *)tmpNumber{
return [self reviseNum:tmpNumber];
}
+(NSDecimalNumber *)reviseNum:(NSNumber *)tmpNum{
double tmpValue = [tmpNum doubleValue];
NSString * tmpDoubleStr = [NSString stringWithFormat:@"%lf",tmpValue];
NSDecimalNumber * tmpNumber = [NSDecimalNumber decimalNumberWithString:tmpDoubleStr];
return tmpNumber;
}
使用方法:
AFHTTPSessionManager *mananger = [AFHTTPSessionManager manager];
mananger.responseSerializer.acceptableContentTypes =[NSSet setWithObjects:@"text/html",@"application/json",@"text/json",@"text/javascript",@"text/plain",@"json/html", nil];
[mananger POST:urlStr parameters:dict headers:nil progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSMutableDictionary * tmpDic = [NSMutableDictionary dictionaryWithDictionary:responseObject];
[self setDecimalPointPrecisionProcessing:tmpDic]
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];