iOS 使用AFNetworking解析数据小数丢失精度的问题

问题:在项目中使用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) {
         
       }];
    

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AFNetworking是一个基于Objective-C语言的iOS网络请求框架,它提供了一系列方便的API,帮助开发者快速地进行网络请求并处理响应内容。其原理是基于NSURLConnection和NSURLSession建立的网络请求,通过对网络请求的封装,提供了比原生API更加便捷的操作方式。 常用操作包括: 1. 发起网络请求:使用AFHTTPRequestOperationManager或AFHTTPSessionManager类的GET、POST等方法,可以方便地发起网络请求。 2. 设置请求参数:使用AFHTTPRequestOperationManager或AFHTTPSessionManager类的setParameterEncoding方法或AFHTTPRequestSerializer类的setQueryStringSerializationWithStyle方法,可以设置请求参数的编码格式。 3. 设置请求头:使用AFHTTPRequestOperationManager或AFHTTPSessionManager类的setValue:forHTTPHeaderField方法,可以设置请求头信息。 4. 处理响应数据使用AFHTTPRequestOperation类的completionBlock或AFHTTPSessionManager类的dataTaskWithRequest:completionHandler方法,可以处理请求响应数据。 5. 下载文件:使用AFHTTPRequestOperation类的setDownloadProgressBlock和setCompletionBlockWithSuccess方法或AFHTTPSessionManager类的downloadTaskWithRequest:progress:destination:completionHandler方法,可以实现文件下载功能。 6. 上传文件:使用AFHTTPRequestOperationManager或AFHTTPSessionManager类的POST方法和AFHTTPRequestSerializer类的multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock方法,可以实现文件上传功能。 总体来说,AFNetworking提供了丰富的API和良好的封装,使得iOS开发者能够更加方便地进行网络请求和处理响应数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值