iOS - Json解析精度丢失处理(NSString, Double, Float)

Posted 雨季的雾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS - Json解析精度丢失处理(NSString, Double, Float)相关的知识,希望对你有一定的参考价值。

开发中处理处理价格金额问题, 后台经常返回float类型, 打印或转成NSString都会有精度丢失问题, 因此使用系统自带的NSDecimalNumber做处理, 能解决这问题:
经过测试其实系统NSDecimalNumber是对有问题值做了四舍五入处理


    ?    还有经过测试, 重要的事说三遍:?处理精度有关的数据请用double?处理精度有关的数据请用double?处理精度有关的数据请用double
    float testDouble = [jsonDict[@"Body"][@"Amount"] floatValue]; //有问题 90.989999999999994
    NSString *convertString = decimalNumberWithString([jsonDict[@"Body"][@"Amount"] stringValue]);
    NSLog(@"%@", convertString);
       testDouble的值     原始值& NSDecimalNumber处理后打印后的值
//    99.489999999999994 99.49
//    99.989999999999994 99.99
//    90                 90.00
//    90.090000000000003 90.09
//    90.189999999999998 90.19
//    90.290000000000006 90.29
//    90.39              90.39
//    90.489999999999994 90.49
//    90.590000000000003 90.59
//    90.689999999999998 90.69
//    90.790000000000006 90.79
//    90.89              90.89
//    90.989999999999994 90.99


对此自己写了个方法处理 :
/** 直接传入精度丢失有问题的Double类型*/
NSString *decimalNumberWithDouble(double conversionValue){
    NSString *doubleString        = [NSString stringWithFormat:@"%lf", conversionValue];
    NSDecimalNumber *decNumber    = [NSDecimalNumber decimalNumberWithString:doubleString];
    return [decNumber stringValue];
}
强烈建议 :
   有关浮点型数据,后台传字符串的格式,防止丢失精度。































以上是关于iOS - Json解析精度丢失处理(NSString, Double, Float)的主要内容,如果未能解决你的问题,请参考以下文章

iOS - Json解析精度丢失处理(NSString, Double, Float)

ios 在json解析过程中浮点型字符串出现精度丢失问题

关于json解析float数据精度的问题

当预期类型可能不同时,如何安全地处理来自 JSON 的数据?

BigDecimal精度丢失处理

前后的交互js数字精度丢失解决,金额保留两位小数四舍五入统一解决,自定义Json序列化处理方法,@JsonSerialize使用