后臺返回float類型解析出現多位小數點的解決辦法

很多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的情況。

基本上上面兩種方案都能很好的解決問題,歡迎留言交流。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容