【发布时间】:2013-01-30 00:59:39
【问题描述】:
在我的应用程序中,我使用了一个使用 json 进行通信的外部 API。今天我遇到了浮点数和 NSNumbers 之间的奇怪行为(可能只是因为我对 iOS 缺乏经验而感到奇怪)。问题是我在 API 响应中收到一个浮点数,在这种特殊情况下它是 135.99。当本机 obj-c json 解析器解析响应时,它会使用该值创建 NSNumber。它工作完美。但是当我开始使用这个 API 的时候,我并不知道原生 json 解析器是怎么做的,所以我一直在做这样的事情:
NSNumber * number = [NSNumber numberWithFloat:[[response objectForKey:@"Number"] floatValue]];
所以,上面发生的实际上是将 NSNumber 转换为浮点数并使用该浮点数创建新的 NSNumber。它有什么奇怪的?奇怪(对我来说)是上面的行生成 NSNumber 的值...... 135.99001 而不是 135.99 这是正确的。
我知道浮点运算真的很糟糕,尤其是在 PHP 之类的语言中(0.2 + 0.7 不等于 0.9),但我没想到在 Objective-c 这样的语言中,它是 C 语言的超集,我会发现这样的乱七八糟的。有人对这个问题有很好的解释吗?
【问题讨论】:
-
那么,上面发生的事情实际上是将 NSNumber 转换为浮点数并使用该浮点数创建新的 NSNumber。 为什么?
-
如果您通过完全避免转换来“修复”代码会发生什么:
NSNumber * number = [response objectForKey:@"Number"]? -
它工作正常,但我犯了上面提到的错误,我已经弄清楚了。我的问题是为什么有两个不同的值(135.99 和 135.99001),而这两种情况下应该有一个相同的值(135.99),而不是如何解决它,因为我已经知道了。
-
好的,如果您使用
double而不是float(numberWithDouble和doubleValue)会发生什么? -
一般来说,浮点运算并不是真的搞砸了。关于 SO 的证据是,许多人对 f-p 算术的性质、微妙之处和陷阱的理解真的搞砸了。
标签: objective-c casting floating-point nsnumber