我想出了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