如何添加NSDecimalNumber?

时间:2010-03-15 18:16:53

标签: iphone objective-c nsdecimalnumber

好的,这可能是当天的愚蠢问题,但假设我有一个班级:

NSDecimalNumber *numOne   = [NSDecimalNumber numberWithFloat:1.0];
NSDecimalNumber *numTwo   = [NSDecimalNumber numberWithFloat:2.0];
NSDecimalNumber *numThree = [NSDecimalNumber numberWithFloat:3.0];

为什么我不能有一个添加这些数字的函数:

- (NSDecimalNumber *)addThem {
    return (self.numOne + self.numTwo + self.numThree);
}

我提前为自己做个白痴道歉,谢谢!

5 个答案:

答案 0 :(得分:23)

你不能做你想要的,因为C和Objective C都没有运算符重载。相反,你必须写:

- (NSDecimalNumber *)addThem {
    return [self.numOne decimalNumberByAdding:
        [self.numTwo decimalNumberByAdding:self.numThree]];
}

如果您愿意使用Objective-C ++(将您的源代码重命名为.mm),那么您可以写:

NSDecimalNumber *operator + (NSDecimalNumber *a, NSDecimalNumber *b) {
    return [a decimalNumberByAdding:b];
}

现在你可以写:

- (NSDecimalNumber *)addThem {
    return self.numOne + self.numTwo + self.numThree;
}

去C ++!

答案 1 :(得分:10)

NSDecimalNumber是一个Objective C类,在实例化时,会生成一个包含数字的对象。您只能通过方法访问对象(以及一般的对象)。 Objective C没有办法直接表示对象的算术,所以你需要进行三次调用之一:

  • - [NSDecimalNumber doubleValue],在添加数字之前从对象中提取数字。 link
  • - [NSDecimalNumber decimalNumberByAdding],它创建了一个额外的对象,可能比您想要的多。 link
  • NSDecimalAdd,再次创建一个额外的对象,可能比您想要的多。 link

答案 2 :(得分:6)

参见NSDecimalAdd函数(以及NSDecimalMultiply,NSDecimalDivide,NSDecimalSubtract)。

答案 3 :(得分:2)

[[numOne decimalNumberByAdding:numTwo] decimalNumberByAdding:numThree]

答案 4 :(得分:2)

你可以:

- (NSDecimalNumber *)addThem {
    return [[self.numOne decimalNumberByAdding:numTwo] decimalNumberByAdding:numThree];
}

你的例子的问题是self.numOne实际上位于某个级别是指向对象的指针。所以你的函数会返回一些随机的内存位置,而不是总和。

如果Objective-C支持C ++样式的运算符重载,则当应用于两个NSDecimalNumber对象作为+的别名时,有人可以定义decimalNumberByAdding:。但事实并非如此。