美文网首页iOS开发技术iOS 技术点iOS学习收录
iOS - Json解析精度丢失处理(NSString, Dou

iOS - Json解析精度丢失处理(NSString, Dou

作者: MonsterNanny | 来源:发表于2016-07-07 11:53 被阅读8367次

    开发中处理处理价格金额问题, 后台经常返回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];
    }
    

    强烈建议 :

       有关浮点型数据,后台传字符串的格式,防止丢失精度。

    相关文章

      网友评论

      • 追沐:楼主,为什么我让后台把数据不要加解密,他们直接传给我,我看了他们发给我的直接传的数据,他们的数据里,字符串也有这样的问题。不知道什么原因。
        fdb22a2a5519:我觉得这是NSNumber的bug, 但不确定是不是iOS10才出现的, 目前我测试 8.3, 9.7这两个数据,一定会, 自己创建 一个NSNumber *number = @(8.3), 转成NSString就会变成8.300000000000001. 经证明: NSNumber包装的数值是double的话, 就有可能出现这种情况. float就不会. 而在解析Json数据的时候, 都会把有小数点的数据当成double, 所以让后台传浮点型数据的话一定要用字符串格式. 用数值的话, 就要自己先转成NSDecimalNumber类, 或者强制成float的NSNumber对象.
      • feng_dev:是只针对要显示的数据还是 就算要拿来在APP里面计算的也都返回string

      本文标题:iOS - Json解析精度丢失处理(NSString, Dou

      本文链接:https://www.haomeiwen.com/subject/lbhljttx.html