服務(wù)端給客戶端返回數(shù)據(jù)一般使用 JSON 字符串,iOS 端一般會將 JSON 轉(zhuǎn)成 Dictionary 使用。于是坑就來了。
這是一個簡單的 JSON 串:
{"progress":64.4}
值得注意的是 JSON 串被轉(zhuǎn)換成 Dictionary 后會將基本數(shù)值類型轉(zhuǎn)換成__NSCFNumber 類型(私有類,其父類為NSNumber)。我要取出 progerss 的值顯示在 label 上,可能這樣寫:
label.text = [dict[@"progress"] stringValue];
// 或者
label.text = [NSString stringWithFormat:@"%@", dict[@"progress"]];
結(jié)果label.text不是64.4而是64.40000000000001??梢?code>NSNumber直接轉(zhuǎn)NSString會造成浮點數(shù)的精度丟失。
解決辦法:
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];
答:因為這樣會保留小數(shù)點后面無意義的'0'.