iOS 关于网络数据解析小数位精度丢失问题的修正

近日,项目中出现了部分后台返回数据,特别是价格时,小数位会出现很多00001的现象,

Xcode上读取数据

而在谷歌浏览器测试后台返回数据时,正常显示是只有2位,后台也说只返给了2位小数给我,

谷歌浏览器上读取数据

百思不得其解,只能认为是开发环境不同造成的问题。首先想到的解决方案是利用 %.2f 进行截取四舍五入,其实可以正常使用,只是保留了两位小数。后来网上查阅得知其实是,NSNumber的description方法不够严谨,在调用NSNumber的description方法打印数值时,会发生精度损失。如果是double类型,建议把NSNumber转换成double再进行输出或计算。

解决方法:在后台返回float或者double类型时,利用NSDecimalNumber处理精度丢失问题。此处我是以string方式接收的,直接添加NSString的分类,修正方法如下:

+(NSString *)reviseString: (NSString *)str

{

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

double conversionValue = [str doubleValue];

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

NSDecimalNumber *decNumber = [NSDecimalNumber decimalNumberWithString:doubleString];

return [decNumber stringValue];

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 在日常的开发中我们随时都会跟数字打着交道,对数字的处理也是很平常的事,本文仅对常用的数字操作一个小结,当一个...
    進无尽阅读 1,187评论 0 2
  • iOS开发中,接受后台的响应,把json然后转化为模型对象,最终转化为NSString对象。 后台返回的一个数字(...
    海边漫步的我阅读 1,971评论 0 4
  • floata =0.01;intb =99999999;doublec =0.0;c = a*b;NSLog(@"...
    Lv明阅读 1,101评论 0 0
  • 1.现象: 因APP业务需要,从后台端取得轨迹点的string,包含一千及以上个经纬度坐标点,数值精度为小数点后六...
    Masazumi柒阅读 2,346评论 0 0
  • 今年初始母亲的性情变来越来越让家人难以忍受,她的固执、唠叨、不讲道理、阴晴不定的脾气给家人造成很大的压力。为此,我...
    诚实的花妖阅读 164评论 0 0