转自: 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;
}