iOS在json解析中出现的类似小数溢出的问题

在之前遇到了一个json解析问题,服务器返回一个小数比如:9.62
比如:9.62
然而我们收到的却是9.619999999999。。。。。
结果
这就比较尴尬了。
毕竟这个锅后台坚决不背,于是我问后台可不可以把value类型改成字符串类型。后台很爽快的答应了,这就没问题了。。。结果并不是这样的!后台以迅雷不及掩耳之势立马取消了聊天记录,然后说:如果要改的话,所有的 这个类型的都会改/*你四舍五入保留2位小数 。
手动蒙蔽脸.jpg
我并不清楚这是什么原因导致的,但是我尝试把结果转化成doubleValue就不会有问题了。关键在于项目中有很多这样的数据,总不能一个一个这样改的。针对model赋值我们可以创建分类重写[setValue: forKey:]方法进行处理。但是官方好像不建议重写原生类的方法,所以最好把项目中的model全部继承自一个基类。在基类中重写
上代码


#define kClass [self class]
/*...*/

- (void)setValue:(id)value forKey:(NSString *)key {
    [super setValue:[kClass change_Value:value] forKey:key];
}

+ (NSString *)change_Value:(id)value {
    NSString *strte = [NSString stringWithFormat:@"%@",value];

    if ([kClass isERRDecimalsStr:strte]) {
        NSString *ster = [NSString stringWithFormat:@"%f",[value doubleValue]];//如果只要确保小数保留两位小数,这里就可以返回了
        return [kClass getMoneyTest:[ster doubleValue]];
    }
    return value;
}
//判断是否是我们所要处理的数据
+ (BOOL)isERRDecimalsStr:(NSString*)text {

    NSString *ascRegex = @"^(\\+|\\-)?[0-9]+[.][0-9]{7,30}$";//一般我们的小数位都是6位,包括地理坐标,如果超过6位,就可能不正常了,可以按需求修改
    NSPredicate *ascTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", ascRegex];
    return [ascTest evaluateWithObject:text];
}
//将小数转化数字格式,取消掉小数位无用的0。如果你不需要,可以跳过
+ (NSString *)getMoneyTest:(float)money {
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];

    numberFormatter.numberStyle = kCFNumberFormatterNoStyle;
    //整数最少位数
    numberFormatter.minimumIntegerDigits = 1;
    //小数位最多位数
    numberFormatter.maximumFractionDigits = 12;
    //小数位最少位数
    numberFormatter.minimumFractionDigits = 0;
    NSString *newAmount = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:money]];
    return newAmount;
}

iOS在json解析中出现的类似小数溢出的问题_第1张图片

你可能感兴趣的:(ios-json解析)