最近在项目中遇到一些问题;虽说这个问题不难,但是,解决起来十分的麻烦,其中就有一些相关的精度问题:
下面我就介绍一下我们遇到的问题
通过网络请求 直接得到一些数据Data ,通过iOS 系统自带的解析方式:
NSDictionary *dic = [NSJSONSerializationJSONObjectWithData:responseObject options:NSJSONReadingMutableContainers |NSJSONReadingMutableLeaves error:nil];
总共20条,下面我们查看第三条,然后查看如图这个字节
我们把 这个字节打印出来(选中那个字节,右击一下,选择 printf Description of "value" 这一选项),这时候可以在控制台看到打印出来的结果
Printing description of ((__NSCFNumber *)0x00007fe4850b46a0):
9.369999999999999
上面看的结果是 (doule)9.37 为什么打印的结果会不同呢,精度的缺失呀
此上为其一
下面还有一种情况 就是:
NSArray *list = [resultobjectForKey:@"list"];
for (NSDictionary * dicin list) {
double testDouble = [dic[@"annualEarnings"]doubleValue];
NSLog(@"%lf", [dic[@"annualEarnings"]doubleValue]);
}
跟上面图一的结果一样,但是当我
NSLog(@"%@",result);
为什么会出现上述的如此情况,问题的出现在所难免,其中一部分是iOS 系统编译器的问题,那么,作为一个程序员,能做的就是去解决这类问题(因为编译器的问题你也解决不了),遇到问题要想办法去解决
下面是我在项目中运用的方法去解决这个问题
首先 我定义了一个方法:
/*
此方法把double ---> NSString
*/
- (NSString *)decimalNumberWithDouble:(double)conversionValue
{
NSString *doubleString = [NSStringstringWithFormat:@"%lf", conversionValue];
NSDecimalNumber *decNumber = [NSDecimalNumberdecimalNumberWithString:doubleString];
return [decNumber stringValue];
}
然后我们可以在遍历字典
NSArray *list = [resultobjectForKey:@"list"];
for (NSDictionary * dicin list) {
double testDouble = [dic[@"annualEarnings"]doubleValue];
NSString *convertString = [selfdecimalNumberWithDouble:testDouble];
NSLog(@"%@",convertString);
}
再如:
NSString *convertString = [self decimalNumberWithDouble:9.3699999999];
NSLog(@"%@",convertString);//9.37 方法在上面
NSString *doubleString = [NSString stringWithFormat:@"%lf", 9.3699999999];
NSLog(@"%@",doubleString);//9.370000
NSString *doubleString = [NSString stringWithFormat:@"%lf", 9.3688889999];
NSLog(@"%@",doubleString);//9.368889
上面都是一些精度相关的问题
附录:下面这个方法是字符串转化成double类型 解决精度问题
/*
*字符串转化成double类型
*/
- (double)StringChangeToDoubleForJingdu:(NSString *)textString
{
if (textString == nil || [textString isEqualToString:@""]) {
return 0.0;
}
NSNumberFormatter *formatter = [[NSNumberFormatteralloc]init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
return [[formatter numberFromString:textString]doubleValue];
}