The compare method: follows standard C rules for type conversion. For example, if you compare an NSNumber object that has an integer value with an NSNumber object that has a floating point value, the integer value is converted to a floating point value for comparison.
In addition, by initializing an NSNumber with a float, converting it to double loses some precision.
NSNumber* number1 = [NSNumber numberWithFloat:1.004]; NSNumber* number2 = [NSNumber numberWithDouble:1.004]; NSLog(@"number1 double: %1.16f", [number1 doubleValue]); NSLog(@"number2 double: %1.16f", [number2 doubleValue]); NSLog(@"number1 objCType %s", [number1 objCType]); NSLog(@"number2 objCType %s", [number2 objCType]); 2012-02-09 15:59:49.487 testNSNumber[89283:f803] number1 double: 1.0039999485015869 2012-02-09 15:59:49.488 testNSNumber[89283:f803] number2 double: 1.0040000000000000 2012-02-09 16:21:01.655 testNSNumber[4351:f803] number1 objCType f 2012-02-09 16:21:01.656 testNSNumber[4351:f803] number2 objCType d
If you know that you can have a combination of float and double, one solution is to compare NSNumber floatValues, as you did in the last line of your code snippet in your question.
Alternatively, you can get the data type in NSNumber using the objCType method.
picciano
source share