我想出了NSNumber
的奇怪行爲。NSNumber與其floatValue不一樣
基本上是我的代碼API調用獲取JSON:
id json_response = [NSJSONSerialization
JSONObjectWithData:data
options:NSJSONReadingMutableLeaves
error:&error];
,並存儲爲NSDictionary
然後我從中得到了NSNumber
和使用NSNumberFormatter
將其轉換爲一個字符串,但...
NSNumber * avgNumber = [[_tableDataArray objectAtIndex:index ]
objectForKey:kTrendsKeyAvgScoreFloat];
這裏是格式化輸出:
NSNumberFormatter * formatter = [[NSNumberFormatter alloc]init];
[formatter setDecimalSeparator:@","];
[formatter setMaximumFractionDigits:1];
[formatter setMinimumFractionDigits:0];
[formatter setGroupingSeparator:@"."];
[formatter setGroupingSize:3];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSString * retString = [formatter stringFromNumber:number];
我奇怪的行爲時NSNumber
有1.05
(__NSCFNumber *) avgNumber = 0x0000000155923800 (float)1.050000
值,但與上面代碼中它被打印(而不是預期的1.1):
1
然而,當我檢查浮點值
float avg = [avgNumber floatValue];
原來,
Printing description of avg:
(double) avg = 1.0499999523162842
即使我嘗試將其四捨五入到小數點後2分
avg = roundf(avg * 100); // here 105
avg = avg/100; // and here is 1.0499999523162842 again
但是如果我對代碼進行測試並手動將1.05內NSDictionary
一切正常。
如果有人能解釋這是爲什麼?如何保持每次正確的顯示?
不清楚你的問題是什麼。是不是'NSNumberFormatter'生成'1'而不是'1.1'?在這種情況下,這是因爲它縮小了。或者你被數字「1.04999」而不是「1.05」所困惑?在這種情況下,這只是一個浮點舍入錯誤。 – trojanfoe
http://floating-point-gui.de –
是的,我很困惑,因爲我有1.05,它應該四捨五入到1.1而不是1. – mazziek