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

转自: https://blog.csdn.net/feng_da_ge/article/details/78060936 

在之前遇到了一个json解析问题,服务器返回一个小数比如: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;
}


作者:峰大哥 
来源:CSDN 
原文:https://blog.csdn.net/feng_da_ge/article/details/78060936 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

-----本人使用了上面的方案----

/**
 原文:https://blog.csdn.net/feng_da_ge/article/details/78060936
 0.000000000000001 double失真 9.96 和 9.960000000000001
 */
//将小数转化数字格式,取消掉小数位无用的0。如果你不需要,可以跳过
+ (NSString *)getMoneyFormatter:(double)money {
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    
    numberFormatter.numberStyle = kCFNumberFormatterNoStyle;
    //整数最少位数
    numberFormatter.minimumIntegerDigits = 1;
    //小数位最多位数
    numberFormatter.maximumFractionDigits = 4;
    //小数位最少位数
    numberFormatter.minimumFractionDigits = 0;
    NSString *newAmount = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:money]];
    return newAmount;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值