近日,项目中出现了部分后台返回数据,特别是价格时,小数位会出现很多00001的现象,
而在谷歌浏览器测试后台返回数据时,正常显示是只有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];
}