ios - NSNumber 与其 floatValue 不同

标签 ios objective-c nsdictionary nsnumber

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

即使我尝试将其四舍五入到小数点后两位

    avg = roundf(avg * 100); // here 105
    avg = avg / 100; // and here is  1.0499999523162842 again

但是,如果我测试代码并将 1.05 手动放入 NSDictionary 中,一切都会按预期工作。

如果有人能解释这是为什么?以及如何保存每次正确显示?

最佳答案

问题是 1.05 的值不能用 float 精确表示。这仅适用于 2 的(正或负)幂之和的值。因此,可以精确表示 1 (=2^0) 或 1.03125 (= 2^0 + 2^-5) 之类的值,但是在您的情况下,1.5 的最佳近似值是 1.0499999523162842。
现在当你初始化一个 NSNumberFormatter,并且不设置它的 roundingMode 属性时,它的默认值是 kCFNumberFormatterRoundHalfEven,这意味着数字将被四舍五入 „趋向于最接近的整数,或者如果等距则趋向于偶数。“
因此,如果您的数字是 1.0499999523162842,它将四舍五入为 1.0,输出为 1。

关于ios - NSNumber 与其 floatValue 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34995396/

相关文章:

swift : type String doesn't conform to protocol AnyObject

iOS 共享扩展无法从 Chrome 获取共享 URL

ios - 在自动释放池中使用 Realm 的正确方法是什么?

ios - 如何使用 WatchKit 服务证书?

ios - 从第一个 ViewController 到第二个 ViewController 的图像

ios - 无法在 ObjC 中访问 Swift ViewModel 属性

ios - 如何以下列格式向 NSDictionary 添加元素?

ios - 如何将 key 添加到NSMutableArray

ios - 为什么我的iOS项目Gemfile bundle 更新不一致?

ios - 键值观察不允许枚举上的 Switch 语句