Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSNumber arithmetic

I want to perform some simple arithmetic on NSNumbers and preserve the type. Is this possible?

For example:

- (NSNumber *)add:(NSNumber *)firstNumber to:(NSNumber *)secondNumber;

Is my method definition, and firstNumber and secondNumber are integers then I would like to return an integer that is the integer addition of them both. Equally if both are doubles then to return the result as a double.

It looks like I can get the type (except for boolean) using [NSNumber objCType] as found in this question: get type of NSNumber but I can't seem to extract those types and do the calculation without lots of code to extract the values do the calculation and return the result for every possible type.

Is there a short and concise way of doing this?

like image 386
Magic Bullet Dave Avatar asked Jul 08 '12 07:07

Magic Bullet Dave


People also ask

What is NSNumber in Swift?

NSNumber is a subclass of NSValue that offers a value as any C scalar (numeric) type. It defines a set of methods specifically for setting and accessing the value as a signed or unsigned char , short int , int , long int , long long int , float , or double or as a BOOL .

Why use NSNumber?

The purpose of NSNumber is simply to box primitive types in objects (pointer types), so you can use them in situations that require pointer-type values to work. One common example: you have to use NSNumber if you want to persist numeric values in Core Data entities.

What is NSDecimalNumber?

NSDecimalNumber , an immutable subclass of NSNumber , provides an object-oriented wrapper for doing base-10 arithmetic. An instance can represent any number that can be expressed as mantissa x 10^exponent where mantissa is a decimal integer up to 38 digits long, and exponent is an integer from –128 through 127.

Is NSInteger primitive?

It is not a C primitive (like int, unsigned int, float, double, etc.) NSInteger , CGFloat , NSUInteger are simple typedefs over the C primitives.


2 Answers

If you want to perform arithmetic the best bet would be using an NSDecimalNumber.

NSDecimalNumber have methods to perform arithmetic operations like :

– decimalNumberByAdding:
– decimalNumberBySubtracting:
– decimalNumberByMultiplyingBy:
– decimalNumberByDividingBy:
– decimalNumberByRaisingToPower:
– decimalNumberByMultiplyingByPowerOf10:
– decimalNumberByAdding:withBehavior:
– decimalNumberBySubtracting:withBehavior:
– decimalNumberByMultiplyingBy:withBehavior:
– decimalNumberByDividingBy:withBehavior:
– decimalNumberByRaisingToPower:withBehavior:
– decimalNumberByMultiplyingByPowerOf10:withBehavior:

And since NSDecimalNumber extends NSNumber it also have all methods of an NSNumber, so i think that you could use it in your case without any problem.

like image 147
aleroot Avatar answered Nov 21 '22 14:11

aleroot


For nearly all applications it will be fine to convert to double and back using -doubleValue and –initWithDouble:. This will let you use the standard C symbols (+, -, ...) and functions (exp(), sin()). The only way you would run into trouble is if you were using close to the full precision for 64-bit integer values.

If you want to stick with Objective-C class operations you can use NSDecimalNumber instead.

See also: How to add two NSNumber objects?

like image 37
kevinlawler Avatar answered Nov 21 '22 14:11

kevinlawler