gpt4 book ai didi

ios - 检查数组是否包含对象 :@(float) in Objective-C can unexpectedly return NO

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:29:55 27 4
gpt4 key购买 nike

我有一些方法接收 float 作为参数,并检查这个 float 是否在数组中。为此,我首先将 float 转换为 NSNumber。这是我的代码的可测试简化:

float aFloat = 0.3;
NSNumber *aNSNumber = @(aFloat);

NSArray *anArray = @[@(0.0), @(0.3), @(1.0)];
NSLog(@"%d", [anArray containsObject:aNSNumber]);

此代码将记录 0(即 NO),因此表示 0.3 不在 anArray 中.如果 aFloat 是一个“整数”,例如 0.00.51.0,则测试有效并记录1(即 YES)。除此以外的任何数字(如上面的 0.3)均失败。

另一方面,如果我们将aFloat 更改为double,它就可以工作。或者,如果我们将 anArray 更改为:

NSArray *array = @[[NSNumber numberWithFloat:0.0], [NSNumber numberWithFloat:0.3], [NSNumber numberWithFloat:1.0]];

它也有效。我推测 NSNumber @() 表示法创建了一个 numberWithDouble:

但是,我的问题是,即使当 aFloat 是一个 float 时它不应该工作吗?因为无论如何我都通过将它保存在 aNSNumber 中来“转换”它...而且它不应该自动识别 float 0.3double 0.3 实际上是相同的数字?另外,为什么“圆形”数字仍然有效?

最佳答案

@(0.3) 使用 -numberWithDouble: 因为 0.3 的类型是 double。如果您编写 @(0.3f),那么它将使用 -numberWithFloat:

floatdouble 都不能准确地存储 0.3。 (这类似于用十进制形式写 1/3 的问题 - 你不能使用有限的数字来精确地完成它。)相反,你得到最接近 0.3 的 floatdouble 最接近 0.3。这两个数字彼此不相等,因此 -containsObject: 找不到匹配项。

floatdouble 都可以准确地存储 0.0 和 1.0,因此两种转换都会得到相同的结果并且 -containsObject: 成功。

关于ios - 检查数组是否包含对象 :@(float) in Objective-C can unexpectedly return NO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18426216/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com