在objective-c中,我尝试评估以下表达式:_c = _f / 5 * 8;
它告诉我一个和是二进制表达式的无效参数。
出了什么问题?我刚开始接触objective-c和cocoa,但熟悉php、basic并有一定javascript知识。
在objective-c中,我尝试评估以下表达式:_c = _f / 5 * 8;
它告诉我一个和是二进制表达式的无效参数。
出了什么问题?我刚开始接触objective-c和cocoa,但熟悉php、basic并有一定javascript知识。
Objective-C有多种不同的结构可供计算使用。从其C语言根源中,可以使用原始数字类型,如int
、float
、double
等进行算术运算(例如+
、-
、*
、/
等),这些是您要使用的内容。
在更高层次上,Objective-C还具有NSNumber
对象,它们是上述原始类型的简单包装器。它们在Objective-C中被广泛用于需要存储原始类型的情况下(通常在其他对象中,例如数组和字典中,这些对象不能直接接受原始值)。由于NSNumber
是对象,因此无法直接对它们执行算术操作,您必须首先获取它们的原始值(例如使用intValue
获取整数值或doubleValue
获取双精度浮点数)。由于您的问题中变量代表的含义不清楚,我不想猜测您试图做什么(我不想误导您),但是您可以在NSNumber
类参考文档中了解更多关于NSNumber
的信息。
最后,正如Richard所提到的,还有NSDecimalNumber
。由于它们通常不需要(它们被设计用于容纳非常高精度的数字,远远超出了常规原始值的容量)或者过于复杂而几乎从不使用。它们也有自己的执行算术操作的方法,并且通常与日常使用无关。同样,如果您感兴趣,请查看NSDecimalNumber
类参考文档 以获取更多信息。
大多数情况下,您需要使用原始数字进行计算。当您需要存储它们时,通常可以将其装箱(box)和拆箱(unbox)(存储和检索)到NSNumber
对象中。
NSDecimalNumber
确实是一个不错的选择。 - Itai Ferber在对象(如NSNumber)中,无法执行这些操作。因此,您必须取其int/double/long/float值。我不知道NSNumber是哪一个,因此这里提供两种解决方案,其中一种将起作用:
_c = [_f doubleValue] / 5 * 8;
或者:
_c = [NSNumber numberWithDouble:(_f / 5 * 8)];
NSNumber
不能对它们应用数学符号。在你的情况下,你的代码实际上会像这样,使用NSDecimalNumber代替(它有用于乘法和除法的选择器):
NSDecimalNumber *_c = nil;
NSDecimalNumber *_f = [NSDecimalNumber decimalNumberWithString:@"7"];
_c = [[_f decimalNumberByDividingBy:[NSDecimalNumber decimalNumberWithString:@"5"]] decimalNumberByMultiplyingBy:[NSDecimalNumber decimalNumberWithString:@"8"]];
虽然不太美观,但这就是Objective-C处理数字的方式。你的另一个选择是获取每个目标数字的doubleValues,然后将它们相乘。
NSDecimalNumbers
不是 "Objective-C 处理数字的方式",而是用于计算非常高精度数字的类。它们不应该用于像这样简单的数学运算; 在这种情况下,使用普通的 NSNumbers
即可,没有必要使用它们。 - Itai Ferber5/8
不值得 - 那种精度通常是不必要或不可取的。再次强调,我并不是因为你建议使用NSDecimalNumber
而给你投了反对票(我觉得它们很有趣,想更经常地使用它们),而只是因为我认为告诉那些还不知道区别的人“这是正确的方法”是误导性的。请看我的答案,了解我的想法。 - Itai FerberNSDecimalNumber
的最简单方式 - 它会鼓励不良的编程习惯和风格。我肯定不希望看到人们把数字硬编码到所有东西的“字符串”中(魔法数字已经够糟糕了!)。再次强调,这不是为新手准备的,而是为那些知道自己在做什么并且需要这些的人准备的;他们之所以不易于使用,是有原因的。 - Itai Ferber