我想对NSNumbers执行一些简单的算术并保留类型。这可能吗?
例如:
- (NSNumber *)add:(NSNumber *)firstNumber to:(NSNumber *)secondNumber;
我的方法定义,firstNumber和secondNumber是整数,然后我想返回一个整数,它们都是它们的整数加法。同样,如果两者都是双打,那么将结果作为双精度返回。
看起来我可以使用[NSNumber objCType]
获取类型(布尔除外),如此问题所示:get type of NSNumber但我似乎无法提取这些类型并且无需大量计算提取值的代码进行计算并返回每种可能类型的结果。
这样做有简短的方法吗?
答案 0 :(得分:10)
如果你想进行算术,最好的选择是使用NSDecimalNumber。
NSDecimalNumber具有执行算术运算的方法,如:
– decimalNumberByAdding:
– decimalNumberBySubtracting:
– decimalNumberByMultiplyingBy:
– decimalNumberByDividingBy:
– decimalNumberByRaisingToPower:
– decimalNumberByMultiplyingByPowerOf10:
– decimalNumberByAdding:withBehavior:
– decimalNumberBySubtracting:withBehavior:
– decimalNumberByMultiplyingBy:withBehavior:
– decimalNumberByDividingBy:withBehavior:
– decimalNumberByRaisingToPower:withBehavior:
– decimalNumberByMultiplyingByPowerOf10:withBehavior:
由于NSDecimalNumber扩展了NSNumber,它也拥有NSNumber的所有方法,所以我认为你可以在你的情况下使用它而没有任何问题。
答案 1 :(得分:3)
对于几乎所有应用程序,只需使用double
和-doubleValue
转换为–initWithDouble:
并返回即可。这将允许您使用标准C符号(+, - ,...)和函数(exp()
,sin()
)。遇到麻烦的唯一方法是使用接近64位整数值的完全精度。
如果您想坚持使用Objective-C类操作,可以使用NSDecimalNumber
代替。
答案 2 :(得分:2)
如何将表达式值计算为double(将所有输入作为double值),然后检查结果是否为整数?然后,您只需使用NSNumber numberWithInt:
或NSNumber numberWithDouble:
即可返回结果。
当您检查结果值是否为整数时,请务必考虑舍入误差(例如,当1表示为0.99999999时等)。
编辑:刚刚在NSNumber的文档中注意到这句话:
请注意,数字对象不一定保留它们的类型 用。创建。
我认为这意味着你无法可靠地做你想做的事。