- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是的,我已经阅读了 stackoverflow 上关于比较 NSNumber 的其他帖子,但它们似乎都没有完全解决这种特殊情况。
这个解决方案特别糟糕...... NSNumber compare: returning different results
因为建议的解决方案根本不起作用。使用 abs(value1 - value2) < tolerance 从一开始就是有缺陷的,因为小数值被剥离,使得 tolerance 无关紧要。
并且来自 Apple 文档... NSNumber 明确不保证返回的类型将与用于创建它的方法相匹配。换句话说,如果给你一个 NSNumber,你无法确定它是否包含 float、double、int、bool 或其他任何东西。
此外,据我所知,NSNumber isEqualToNumber 是比较两个 NSNumber 的不可信方法。
鉴于这些定义...
NSNumber *float1 = [NSNumber numberWithFloat:1.00001];
NSNumber *double1 = [NSNumber numberWithDouble:1.00001];
如果您运行调试器,然后使用 == 对这些相同的数字进行 2 次比较,则一次失败,而另一次则没有。
p [double1 floatValue] == [float1 floatValue] **// returns true**
p [double1 doubleValue] == [float1 doubleValue] **// returns false**
如果您使用 isEqualToNumber 比较它们
p [float1 isEqualToNumber:double1] **// returns false**
因此,如果 isEqualToNumber 将返回 false,假设 NSNumber 的创建是一个黑盒子,可能会在输出时为您提供一些其他类型,我不确定该方法有什么好处。
因此,如果您要对脏进行测试,因为现有值已更改为新值...最简单的方法是什么来处理所有 NSNumber 比较...而不仅仅是 float 和 double , 但所有的 NSNumbers 呢?
似乎转换为字符串值,然后进行比较是最有用的,或者使用 NSNumberFormatter 可能需要大量额外代码。
你有什么想法?
最佳答案
不可能可靠地比较两个 IEEE float 或 double 。这与 NSNumber
无关。这就是 float 的本质。这在 Strange problem comparing floats in objective-C 的简单 C 类型的上下文中进行了讨论。 . 唯一比较 float 的正确方法是通过测试公差。我不知道你所说的“小数值被剥离”是什么意思。在浮点表示中,一些数字总是丢失。
您提供的特定测试值很好地说明了问题。 1.00001 不能用有限的二进制数字精确表示。 Wolfram Alpha是探索这个的好方法,但作为 double ,1.00001 舍入为 1.0000100000000001。作为 float ,它四舍五入为 1.00001001。显然,这些数字并不相等。如果您以不同的方式往返它们,您应该不会对 isEqualToNumber:
失败感到惊讶。这应该清楚为什么您的两个 floatValue
调用确实相等。四舍五入到 float 的精度,它们“足够接近”。
如果要比较 float ,则必须与 epsilon 进行比较。考虑到编译器优化的最新进展,如果您使用 -Ofast
(我们变得很大通过允许这样做可以提高性能)。
如果您需要一些特定数量的有效小数位,那么通常最好使用定点表示法。只需按您需要的位数缩放所有内容并以整数形式工作。如果您需要 float ,但只想以 10 为基数(而不是以 2 为基数)工作良好,则使用 NSDecimalNumber
或 NSDecimal
。这会将您的问题转移到以 10 为基数的不好的地方。但是,如果您在处理 float ,则必须处理舍入错误。
有关更广泛的讨论,请参阅 "What Every Programmer Should Know About Floating-Point Arithmetic."
关于ios - 将 NSNumber 实例与 isEqualToNumber 进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30227457/
我正在开发一些代码,其中我使用扫描仪从字符串中获取 NSNumbers,例如 x 和 y。 现在我想从 x 和 y 计算一些简单的东西,比如 z = 10.0/(x + y/60.0)/60.0)。我
第一次发帖。 NSNumber 的 floatValue 方法有问题——不知何故,它返回一个不精确的数字。问题在于:我将一堆 NSNumbers 存储在一个数组中,如下所示: NSArray *a =
我在尝试使用从基类继承的泛型函数的参数时遇到标题错误 基类: BaseBottomBar: UIView { ... func formatDetailText(value: T...
我有下面这行代码 NSNumber *myValue = loadTempValue*0.420; 我试图将 *myValue 的值设置为 loadTempValue*0.420 的值, 但是,我得到
我在将 NSNumber 转换为字符串以及将字符串转换为 NSNumber 时遇到问题。 这是一个示例问题: NSString *stringValue = @"9.2"; NSNumberForma
有一个坐标对象,具有三个变量纬度(NSNumber),经度(NSNumber)和时间(NSDate),为了在我的模拟器上检查程序,我给出了以下代码 [coordinate setLatitude:[N
简单方法:我有一个 SearchView,用户可以在其中选择一些 CoreDate,然后他可以搜索 Name、City( >NSString) 和Clientnumber (NSNumber) NSP
我转换这个 Objective-C 函数: - (NSArray *)grt_map:(id (^)(id))block { NSMutableArray *newArray = [NSMut
示例:我有一个 NSInteger,我将其包装到一个 NSNumber 对象中。现在我想要一个具有该 NSInteger 值的 NSDecimal。 那么我可以问: NSDecimal myDecim
我有这个自定义类: @interface MyModel : NSObject @property (nonatomic,strong) NSString *id_name; @property (n
在我的应用程序中,我进入 CoreData 并获取一个类型为 Double 的条目,然后我试图将该值放入我的应用程序的文本字段中。 这看起来像 lengthTextField.text = lastS
用户输入一个数字( float 或整数),并且它必须大于下限。 这是从 UITextField 获取数字的代码: NSNumberFormatter * f = [[NSNumberFormatter
我正在为 iPhone 应用程序使用 NSNumber,并看看我能用它做什么。对于我的大多数变量,我简单地将它们存储为“int”或“float”或其他类型。但是,当我必须传递一个对象(例如在字典中)时
我使用 [NSNumber numberWithDouble:] 方法来形成我的 NSNumber。但是,由于某些值可能很大,我想知道是否有办法告诉 NSNumber 用科学记数法表示自己。提前致谢!
一个 NSNumber 可以存储不同的基本类型,如short、int、long、long long、float、double 但是当我这样做时,尺寸会改变 @(long long) 相比 @(int)
我编写了一个 Objective-C 类,并且在我的 iPhone 项目中的多个 View 中使用它的共享实例。它的成员变量包括 bools、ints、NSStrings 和一个 NSNumber。共
创建一个 ARC 新项目并将此代码注入(inject)到 didFinishLaunchingWithOptions 中。 for (int i=0; i < 1000000; i++) {
我对 Objective C 比较陌生,需要一些数组帮助。 我有一个 plist,其中包含一个字典和一个 NSNumber 数组,还有更多数组可供使用稍后添加。 NSMutableDictionary
我正在尝试将 NSNumber 放入数组中: NSNumber *n = [NSNumber numberWithInt:1]; [[array objectAtIndex:0] setValue:n
我正在开发一个简单的计算器 iPhone 应用程序。只是为了练习的目的。我有一个 IBAction 方法来存储用户输入的数字。整个概念是计算器应用程序堆积待处理的操作,以便用户可以执行多个操作,并且屏
我是一名优秀的程序员,十分优秀!