2012-03-27 34 views
4

在Objective-C中,我试图评估以下表达式:_c = _f/5 * 8; 它告诉我,intNSNumber是二进制表达式的无效参数。数学与NSNumbers和整数

怎么了?我刚刚开始使用Objective-C和可可,但熟悉PHP和基本和熟悉JavaScript。

+2

什么样的变量是_c和_f? – Manuel 2012-03-27 11:54:27

+0

_c和_f是华氏温度和摄氏度(对不起,如果我没有正确拼写) – yskywalker 2012-03-30 16:18:39

回答

10

Objective-C有几种不同的结构可供您在计算中使用。从它的C根开始,可以直接执行算术运算(+,-,*, /等)的原始数字int s,float s,double s等。这些是你想要使用的。

在更高的杠杆上,Objective-C也有NSNumber对象,它们是上面列出的基本类型的简单包装。它们在整个Objective-C中使用,其中需要存储基元(通常在其他对象中,例如不直接获取基元值的数组和字典)。由于NSNumber s是对象,因此不能对它们执行直接算术运算,所以必须先绘制它们的基本值(例如使用intValue来获取整数值,或使用doubleValue来获得双精度浮点数)。由于目前还不清楚变数在您的问题中的含义,所以我不打算猜测您要做什么(我不想误导您),但您可以了解更多关于NSNumberNSNumber Class Reference

最后,正如Richard所说,有NSDecimalNumber s。这些几乎从来没有使用过,因为它们或者根本不需要(它们被设计为保持极高精度的数字,远远超出常规原始值的容量),或者使用起来太复杂。他们也有自己的方法来进行算术运算,并且通常与日常使用无关。再一次,如果你有兴趣,看看更多NSDecimalNumber Class Reference

大部分情况下,您正在寻找使用原始数字来进行计算。当你需要存储它们时,你可以经常从NSNumber对象中'box'和'unbox'(存储和检索)。

+3

+1但我会说NSDecimalNumber是用于货币值的很好的类型。 – JeremyP 2012-03-27 15:00:43

+0

@JeremyP是的,但取决于你正在处理的货币和你正在执行的操作,我甚至会认为将你的货币简单地表示为基值的整数倍是个好主意(例如,美分而不是美元),所以你可以绕过任何需要分数量的金钱(这样做毫无意义)。当然,如果你正在做百分比或转换,那么是的,'NSDecimalNumber'确实是一个不错的选择。 – 2012-03-27 16:23:40

4

你不能用对象做这些事情(在这种情况下是NSNumber)。所以你将不得不采取'int/double/long/float的值。我不知道哪一个是NSNumber的,所以这里有2个解决方案,1将工作:

_c = [_f doubleValue]/5 * 8; 

或:

_c = [NSNumber numberWithDouble:(_f/5 * 8)]; 

希望它可以帮助应用

1

NSNumber s不能有数学符号给他们。在你的情况,你的代码实际上是这样的,使用NSDecimalNumber代替(其中有选择乘法和除法的数字):

NSDecimalNumber *_c = nil; 
NSDecimalNumber *_f = [NSDecimalNumber decimalNumberWithString:@"7"]; 

_c = [[_f decimalNumberByDividingBy:[NSDecimalNumber decimalNumberWithString:@"5"]] decimalNumberByMultiplyingBy:[NSDecimalNumber decimalNumberWithString:@"8"]]; 

这是丑陋的,但它是如何的Objective-C涉及数字。您的另一种选择是获得每个目标数字的doubleValues,然后将它们相乘。

+1

这个答案有误导性。“NSDecimalNumbers”不是“Objective-C如何处理数字”,而是一个用于计算机的非常高精度的数字。它们并不意味着用于这样的简单数学;在这种情况下,没有理由在常规的'NSNumbers'上面使用它们。 – 2012-03-27 12:14:17

+0

@ItaiFerber不正确。使用NSDecimalNumber的一个主要优点是精度高,即使对于上面那样的小型计算,精度所需的开销也是非常有用的,并且它具有被放入基本类型数组中的优点。另外不要忘记,使用NSNumber的-doubleValue进行乘法是非常有损耗的,并且会导致相当多的精度丢失,例如, 1/5 * 5!= 1,你也不必担心整数除法。专业人士大大超过了缺点,这就是为什么我选择NSDecimalNumber – 2012-03-27 12:20:25

+1

尽管我同意你们的看法,他们确实有他们的优势,但我认为他们不值得仅仅用'5/8'来代替某些东西 - 精度通常不是必需的或合意的。再一次,我没有投票,只是因为你建议使用'NSDecimalNumber'(我觉得它们很吸引人,并且希望更频繁地使用它们),但仅仅因为我认为误导人们告诉一个还不知道差别的人“这是做到这一点的方式”。看到我的答案,我的想法。 – 2012-03-27 12:24:49