服務(wù)端給客戶端返回?cái)?shù)據(jù)一般使用 JSON 字符串歹颓,iOS 端一般會將 JSON 轉(zhuǎn)成 Dictionary 使用埠况。于是坑就來了蹬刷。
這是一個(gè)簡單的 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
腌巾∩螅可見NSNumber
直接轉(zhuǎn)NSString
會造成浮點(diǎn)數(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];
答:因?yàn)檫@樣會保留小數(shù)點(diǎn)后面無意義的'0'.