天天看點

iOS double、float 轉 NSString的大坑

服務端給用戶端傳回資料一般使用 JSON 字元串,iOS 端一般會将 JSON 轉成 Dictionary 使用。

這是一個簡單的 JSON 串:

{"progress":64.4}
           

值得注意的是 JSON 串被轉換成 Dictionary 後會将基本數值類型轉換成

__NSCFNumber

類型(私有類,其父類為

NSNumber

)。我要取出 progerss 的值顯示在 label 上,可能這樣寫:

label.text = [dict[@"progress"] stringValue];
// 或者
label.text = [NSString stringWithFormat:@"%@", dict[@"progress"]];
           

結果

label.text

不是

64.4

而是

64.40000000000001

。可見

NSNumber

直接轉

NSString

會造成浮點數的精度丢失。

解決辦法:

double d            = [dict[@"progress"] doubleValue];
NSString *dStr      = [NSString stringWithFormat:@"%f", d];
NSDecimalNumber *dn = [NSDecimalNumber decimalNumberWithString:dStr];
label.text          = [dn stringValue];
           
為什麼不直接使用下面的方法?
double d   = [dict[@"progress"] doubleValue];
label.text = [NSString stringWithFormat:@"%f", d];
           

答:因為這樣會保留小數點後面無意義的'0'.

iOS