【发布时间】:2016-01-25 14:48:21
【问题描述】:
我遇到了NSNumber 的奇怪行为。
基本上我的代码从 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感到困惑?在这种情况下,这只是一个浮点舍入错误。 -
是的,我很困惑,因为我有 1.05,它应该四舍五入到 1.1 而不是 1。
标签: ios objective-c nsdictionary nsnumber