iOS 解决相关的精度问题

最近在项目中遇到一些问题;虽说这个问题不难,但是,解决起来十分的麻烦,其中就有一些相关的精度问题:

下面我就介绍一下我们遇到的问题


通过网络请求 直接得到一些数据Data ,通过iOS 系统自带的解析方式:

NSDictionary *dic = [NSJSONSerializationJSONObjectWithData:responseObject options:NSJSONReadingMutableContainers |NSJSONReadingMutableLeaves error:nil];

把data 转换成dic 

我通过断点的方式,可以查看所有的数据

总共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);

        }

j结果如图

看见了了没  精度没有缺失

所以,遇到问题要解决:


再如:

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

 

}


猜你喜欢

转载自blog.csdn.net/jq2530469200/article/details/52061970