服務端給客戶端返回數據一般使用 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'.