objective-c - NSNumber 和 float - 类型类型转换怪事

标签 objective-c casting floating-point nsnumber

在我的应用程序中,我使用了一个使用 json 进行通信的外部 API。今天我遇到了 floats 和 NSNumbers 之间的奇怪行为(这可能只是因为我对 iOS 缺乏经验)。问题是我在 API 响应中收到一个 float ,在这种特殊情况下是 135.99。当 native obj-c json 解析器解析响应时,它会使用该值创建 NSNumber。它工作完美。但是当我开始使用这个 API 时,我不知道原生 json 解析器是如何处理的,所以我一直在做这样的事情:

NSNumber * number = [NSNumber numberWithFloat:[[response objectForKey:@"Number"] floatValue]];

所以,上面发生的事情实际上是将 NSNumber 转换为 float 并使用该 float 创建新的 NSNumber。这有什么奇怪的呢?奇怪的是(对我来说)上面一行生成的 NSNumber 值为... 135.99001 而不是 135.99,这是正确的。

我知道浮点运算真的很乱,尤其是在像 PHP 这样的语言中(0.2 + 0.7 不等于 0.9),但我没想到在像 objective-c 这样的语言中,它是 C 语言的超集,我会找这么乱来的。有人对这个问题有很好的解释吗?

最佳答案

您犯了一个初学者错误,即假设“float”是 float 的正确类型。它不是。除非你有充分的理由使用 float,否则“double”是你应该使用的类型。 JSON 解析器将不可避免地使用 [NSNumber numberWithDouble:...] 来创建它们存储的 NSNumber 对象(或 [NSNumber numberWithLongLong:...] 或 NSDecimalNumber),但从不 [NSNumber numberWithFloat:].

与 double 相比,float 的精度非常有限。你可以肯定,在大多数情况下,[NSNumber numberWithFloat:...] 会因为精度有限而给你不同的结果。

关于objective-c - NSNumber 和 float - 类型类型转换怪事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14871210/

相关文章:

ios - 将多张图片上传到 Parse 的正确方法

java - Google 编码挑战未检测到 int

c++ - 通过重新解释转换将 constexpr 值转换为指针

c++ - 如果您之前将其初始化为零,那么将 double 值与零进行比较是否正确?

c# - 将字符串通用解析为 float

iphone - ShareKit - 将链接图像发布到 facebook 墙上

iphone - 我如何等到另一个类中的动画完成后再继续?

ios - 是否可以从 UIImagePickerController 拍摄多张照片?

c - 打印 long long int 作为 int 输出负值

c# - 获取小数的整数和小数部分