gpt4 book ai didi

iphone - NSNumber 比较 : returning different results

转载 作者:太空狗 更新时间:2023-10-30 03:36:29 25 4
gpt4 key购买 nike

我正在尝试进行一些数字比较,但得到了一些奇怪的结果。

NSNumber* number1 = [NSNumber numberWithFloat:1.004];
NSNumber* number2 = [NSNumber numberWithDouble:1.004];

([number1 compare:number2] == NSOrderedSame) ? NSLog(@"YES") : NSLog(@"NO");
([number1 compare:number2] == NSOrderedAscending) ? NSLog(@"YES") : NSLog(@"NO");
([number1 doubleValue] == [number2 doubleValue]) ? NSLog(@"YES") : NSLog(@"NO");
([number1 floatValue] == [number2 floatValue]) ? NSLog(@"YES") : NSLog(@"NO");

日志输出:

NO
YES
NO
YES

这让我非常沮丧。我知道这可能是因为 float 与 double 的位数不同。在我看来,它正在将 double 向下截断为 float 来进行比较。但是,如果我不知道数字是如何创建的,我该如何获得正确的结果呢?有没有不同的方法来比较 NSNumber 的?

最佳答案

我尝试使用 isEqualToNumber:它返回NO。它们不相同的原因是因为 1.004 不能精确地用二进制表示。 double近似值的小数点后位数多于 float近似值,所以这两个数字是不同的。通常,在比较 float 时,您会测试它们是否等于容差值 fabs(a - b) < tolerance。 :

NSNumber* number1 = [NSNumber numberWithFloat:1.004];
NSNumber* number2 = [NSNumber numberWithDouble:1.004];

NSLog(@"number 1: %.12f", [number1 doubleValue]);
NSLog(@"number 2: %.12f", [number2 doubleValue]);

([number1 isEqualToNumber:number2]) ? NSLog(@"YES") : NSLog(@"NO");
fabs([number1 floatValue] - [number2 doubleValue]) < 1.0e-7 ? NSLog(@"YES") : NSLog(@"NO");

结果:

2012-02-09 15:08:34.272 so9219935[3313:903] number 1: 1.003999948502
2012-02-09 15:08:34.274 so9219935[3313:903] number 2: 1.004000000000
2012-02-09 15:08:34.275 so9219935[3313:903] NO
2012-02-09 15:08:34.275 so9219935[3313:903] YES

关于iphone - NSNumber 比较 : returning different results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9219935/

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