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;
}