美文网首页iOS Developer
后台返回float类型解析出现多位小数点的解决办法

后台返回float类型解析出现多位小数点的解决办法

作者: IFeng_iOSer | 来源:发表于2017-04-21 10:53 被阅读210次

    很多iOS开发者也许碰到过这个问题,就是server明明返回的是48.72,json解析后却是48.71000000009等之类的问题。而且这种问题只是偶现,很难准确的说是不是iOS系统的一个bug。今天简单说一下这个问题的解决方案。

    参考:triplecc.github.io/blog/2017-03-09-nsjsonserializationhe-nsnumber/

    方案1:NSDecimalNumber做处理

    开发中处理处理价格金额问题, 后台经常返回float、double类型, 打印或转成NSString都会有精度丢失问题, 因此使用系统自带的NSDecimalNumber做处理, 能解决这问题:

    处理精度有关的数据先把数据转成double类型

    此处我是以string方式接收的,直接添加NSString的分类,修正方法贴出来如下:

    +(NSString )reviseString:(NSString )string{

    /* 直接传入精度丢失有问题的Double类型*/

    double conversionValue        = (double)[string floatValue];

    NSString *doubleString        = [NSString stringWithFormat:@"%lf", conversionValue];

    NSDecimalNumber *decNumber    = [NSDecimalNumber decimalNumberWithString:doubleString];

    return [decNumber stringValue];

    }

    方案二:写一个NSString的扩展

    @interface NSString (MCPriceString)

    - (NSString *)mc_priceString;

    @end

    @implementation NSString (MCPriceString)

    - (NSString *)mc_priceString {

    static NSNumberFormatter *formatter;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

    formatter = [[NSNumberFormatter alloc] init];

    formatter.maximumFractionDigits = 2;

    formatter.minimumIntegerDigits = 1;

    });

    return [formatter stringFromNumber:[formatter numberFromString:self]];

    }

    @end

    formatter.maximumFractionDigits = 2;表示最多保留两位小数

    formatter.minimumIntegerDigits = 1;表示最少保留一位整数,防止像0.01出现.01的情况。

    基本上上面两种方案都能很好的解决问题,欢迎留言交流。

    相关文章

      网友评论

        本文标题:后台返回float类型解析出现多位小数点的解决办法

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