iOS:浮点型数字json解析之后出现精度差的问题

1.声明一个字符串,里面保存一个number类型的数字

    NSString *jsonString = @"{\"number\":89.6}";

2.转化为json发生了神奇的事情 精确度竟然变了

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:muDic options:kNilOptions error:nil];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"jsonString is %@",jsonString);
2018-09-03 17:24:02.721083+0800 test[41842:2495113] jsonString is {"number":89.599999999999994}

3.我们解析得到值,展示在界面上

NSData *jsonData2 = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
id dic = [NSJSONSerialization JSONObjectWithData:jsonData2 options:NSJSONReadingMutableContainers error:&err];
if(err) {
    NSLog(@"json解析失败:%@",err);
}else{
   NSLog(@"dic is %@",dic);
}
2018-09-03 17:24:02.721247+0800 test[41842:2495113] dic is {
    number = "89.59999999999999";
}

4.这个服务器返回的是正确的,而app转化的时候变化了
可我们得到这个数字之后要怎么展示呢?
可以转化为浮点类型的数字

    NSString *number = [dic objectForKey:@"number"];
    NSString *result = [NSString stringWithFormat:@"%f",number.doubleValue];
    NSLog(@"result is %@",result);
   2018-09-03 17:24:02.721354+0800 test[41842:2495113] result is 89.600000

这个时候有新的问题了:后面有很多0怎么办

    NSString *result2 = [NSString stringWithFormat:@"%g",number.doubleValue];
    NSLog(@"result2 is %@",result2);
2018-09-03 17:24:02.721449+0800 test[41842:2495113] result2 is 89.6

至此完美的解决了问题

5.备注:2018-10-29 发现整形时数据会出现问题,这里需要判断一下

- (NSString *)getnumber:(id)numberId
{
    NSString *str = [NSString stringWithFormat:@"%@",numberId];
    if([str rangeOfString:@"."].length>0)
        
    {
        return [NSString stringWithFormat:@"%g",str.floatValue];
    }else
        
    {
        return str;
    }
}

2018.12.7 发现100014.8 转化变为了 100015,不知道为什么,使用了新的方法

// 服务器返回的数字解析之后出现精度差
+ (NSString *)getnumber:(id)numberId
{
    NSString *num = [NSString stringWithFormat:@"%@",numberId];
    NSDecimalNumber *decNumber    = [NSDecimalNumber decimalNumberWithString:num];
    return [decNumber stringValue];
}

2018.12.10 发现新的方法如下

// 去除float中不必要的0或.
+ (NSString*)backStringFroFloatValue:(CGFloat)floatValue
{
    if (floatValue==0) {
        return @"0";
    }
    NSString * floatValueStr = [NSString stringWithFormat:@"%f",floatValue];
    NSString * s = nil;
    NSInteger offset = floatValueStr.length - 1;
    while (offset)
    {
        s = [floatValueStr substringWithRange:NSMakeRange(offset, 1)];
        if ([s isEqualToString:@"0"]) {
            offset--;
        }else if ([s isEqualToString:@"."])
        {
            offset--;
            break;
        }else
        {
            break;
        }
    }
    NSString * outNumber = [floatValueStr substringToIndex:offset+1];
    return outNumber;
}

你可能感兴趣的:(iOS:浮点型数字json解析之后出现精度差的问题)