使用NSNumber和int进行数学计算

5

在objective-c中,我尝试评估以下表达式:_c = _f / 5 * 8; 它告诉我一个和是二进制表达式的无效参数。

出了什么问题?我刚开始接触objective-c和cocoa,但熟悉php、basic并有一定javascript知识。


2
_c和_f是什么类型的变量? - Manuel
_c 和 _f 分别代表华氏度和摄氏度。(如果我拼错了请见谅。) - yskywalker
3个回答

11

Objective-C有多种不同的结构可供计算使用。从其C语言根源中,可以使用原始数字类型,如intfloatdouble等进行算术运算(例如+-*/等),这些是您要使用的内容。

在更高层次上,Objective-C还具有NSNumber对象,它们是上述原始类型的简单包装器。它们在Objective-C中被广泛用于需要存储原始类型的情况下(通常在其他对象中,例如数组和字典中,这些对象不能直接接受原始值)。由于NSNumber是对象,因此无法直接对它们执行算术操作,您必须首先获取它们的原始值(例如使用intValue获取整数值或doubleValue获取双精度浮点数)。由于您的问题中变量代表的含义不清楚,我不想猜测您试图做什么(我不想误导您),但是您可以在NSNumber类参考文档中了解更多关于NSNumber的信息。

最后,正如Richard所提到的,还有NSDecimalNumber。由于它们通常不需要(它们被设计用于容纳非常高精度的数字,远远超出了常规原始值的容量)或者过于复杂而几乎从不使用。它们也有自己的执行算术操作的方法,并且通常与日常使用无关。同样,如果您感兴趣,请查看NSDecimalNumber类参考文档 以获取更多信息。

大多数情况下,您需要使用原始数字进行计算。当您需要存储它们时,通常可以将其装箱(box)和拆箱(unbox)(存储和检索)到NSNumber对象中。


4
+1 但我认为NSDecimalNumber是用于货币值非常好的类型。 - JeremyP
@JeremyP 是的,但根据你所处理的货币和所执行的操作,我甚至会认为将货币表示为基本值的整数倍(例如以分而不是美元存储所有内容)更好,这样可以避免任何需要小额货币的需求(这使得很少有意义)。当然,如果你正在进行百分比或转换,则 NSDecimalNumber 确实是一个不错的选择。 - Itai Ferber

5

在对象(如NSNumber)中,无法执行这些操作。因此,您必须取其int/double/long/float值。我不知道NSNumber是哪一个,因此这里提供两种解决方案,其中一种将起作用:

_c = [_f doubleValue] / 5 * 8;

或者:

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

希望这能帮到你。

0

NSNumber不能对它们应用数学符号。在你的情况下,你的代码实际上会像这样,使用NSDecimalNumber代替(它有用于乘法和除法的选择器):

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

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

虽然不太美观,但这就是Objective-C处理数字的方式。你的另一个选择是获取每个目标数字的doubleValues,然后将它们相乘。


2
这个答案是误导性的。NSDecimalNumbers 不是 "Objective-C 处理数字的方式",而是用于计算非常高精度数字的类。它们不应该用于像这样简单的数学运算; 在这种情况下,使用普通的 NSNumbers 即可,没有必要使用它们。 - Itai Ferber
@ItaiFerber 不是真的。使用NSDecimalNumber的一个主要优点是它的精度,即使对于像上面那样的小计算,所需的精度开销也非常有用,并且它具有将其放入数组中而不是原始类型的优点。还要记住,使用NSNumber的-doubleValue进行乘法运算会导致很大的精度损失,例如1/5 * 5!= 1,您也不必担心整数除法。优点远大于缺点,这就是为什么我选择NSDecimalNumber的原因。 - Richard J. Ross III
2
虽然我同意它们确实有优点,但我认为仅仅将某物乘以5/8不值得 - 那种精度通常是不必要或不可取的。再次强调,我并不是因为你建议使用NSDecimalNumber而给你投了反对票(我觉得它们很有趣,想更经常地使用它们),而只是因为我认为告诉那些还不知道区别的人“这是正确的方法”是误导性的。请看我的答案,了解我的想法。 - Itai Ferber
2
此外,我不喜欢使用字符串初始化 NSDecimalNumber 的最简单方式 - 它会鼓励不良的编程习惯和风格。我肯定不希望看到人们把数字硬编码到所有东西的“字符串”中(魔法数字已经够糟糕了!)。再次强调,这不是为新手准备的,而是为那些知道自己在做什么并且需要这些的人准备的;他们之所以不易于使用,是有原因的。 - Itai Ferber
我可以将数值存储在浮点数中(我正在尝试制作一个温度转换程序)。 - yskywalker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接