6

我想对 NSNumbers 执行一些简单的算术并保留类型。这可能吗?

例如:

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

是我的方法定义,并且 firstNumber 和 secondNumber 是整数,那么我想返回一个整数,它是它们两者的整数加法。同样,如果两者都是双精度数,则将结果作为双精度数返回。

看起来我可以使用[NSNumber objCType]在这个问题中找到的类型(布尔值除外):get type of NSNumber但我似乎无法提取这些类型并在没有大量代码的情况下进行计算来提取值进行计算和返回每种可能类型的结果。

有没有一种简洁的方法来做到这一点?

4

3 回答 3

10

如果您想执行算术,最好的选择是使用NSDecimalNumber

NSDecimalNumber 具有执行算术运算的方法,例如:

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

而且由于 NSDecimalNumber 扩展了 NSNumber,它还具有 NSNumber 的所有方法,所以我认为你可以在你的情况下使用它而没有任何问题。

于 2012-07-08T08:31:28.207 回答
3

对于几乎所有应用程序,使用and转换double和返回都可以。这将允许您使用标准 C 符号(+、-、...)和函数(、、)。遇到麻烦的唯一方法是使用接近全精度的 64 位整数值。-doubleValue–initWithDouble:exp()sin()

如果你想坚持使用 Objective-C 类操作,你可以使用它NSDecimalNumber

另请参阅:如何添加两个 NSNumber 对象?

于 2012-07-08T07:25:01.887 回答
2

如何将表达式值计算为双精度值(所有输入均为双精度值),然后检查结果是否为整数?然后你只需使用NSNumber numberWithInt:orNSNumber numberWithDouble:返回结果。

当您检查结果值是否为整数时,请务必考虑舍入误差(例如,当 1 表示为 0.99999999 等时)。

编辑:刚刚在 NSNumber 的文档中注意到这句话:

请注意,数字对象不一定保留创建它们的类型。

我认为这意味着你不能可靠地做你想做的事情。

于 2012-07-08T07:28:34.960 回答