很多iOS開發(fā)者也許碰到過這個問題,就是server明明返回的是48.72,json解析后卻是48.71000000009等之類的問題。而且這種問題只是偶現,很難準確的說是不是iOS系統(tǒng)的一個bug。今天簡單說一下這個問題的解決方案。
參考:triplecc.github.io/blog/2017-03-09-nsjsonserializationhe-nsnumber/
方案1:NSDecimalNumber做處理
開發(fā)中處理處理價格金額問題, 后臺經常返回float、double類型, 打印或轉成NSString都會有精度丟失問題, 因此使用系統(tǒng)自帶的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的情況。
基本上上面兩種方案都能很好的解決問題,歡迎留言交流。