【问题标题】:Math with NSNumbers and ints带有 NSNumbers 和整数的数学
【发布时间】:2012-03-27 11:52:35
【问题描述】:

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

怎么了?我刚开始使用objective-c和cocoa,但熟悉php和basic,有点熟悉javascript。

【问题讨论】:

  • _c和_f是什么变量?
  • _c 和 _f 是华氏度和摄氏度。(对不起,如果我没有正确拼写它们。)

标签: objective-c cocoa math xcode4.2


【解决方案1】:

Objective-C 有几种不同的结构供您在计算中使用。从它的 C 根中得到原始数字,ints、floats、doubles 等,您可以在这些数字上直接执行算术运算(+-*/ , ETC。)。这些是您想要使用的。

在更高的层次上,Objective-C 还具有NSNumber 对象,它们是上面列出的原始类型的简单包装器。它们在需要存储原语的整个 Objective-C 中使用(通常在其他对象中,例如不直接获取原始值的数组和字典)。因为NSNumbers 是对象,你不能对它们进行直接的算术运算,你必须首先提取它们的原始值(例如,使用intValue 来获取整数值,或者使用doubleValue 来获取双精度值)精度浮点数)。因为不清楚变量在您的问题中代表什么,所以我不会冒险猜测您正在尝试做什么(我不想误导您),但您可以了解更多关于 @ 987654334@ 在NSNumber Class Reference.

最后,正如理查德所说,有NSDecimalNumbers。这些几乎从不使用,因为它们要么根本不需要(它们被设计为保存极高精度的数字,远远超出常规原始值的容量),要么太复杂而无法使用。它们也有自己的算术运算方法,通常与日常使用无关。同样,如果您有兴趣,请查看NSDecimalNumber Class Reference

在大多数情况下,您希望使用原始数字进行计算。当您需要存储它们时,您通常可以从NSNumber 对象中“装箱”和“拆箱”(存储和检索)。

【讨论】:

  • +1 但我会说 NSDecimalNumber 是用于货币值的好类型。
  • @JeremyP 是的,但是根据您处理的货币和您正在执行的操作,我什至认为将您的货币表示为您的基数的整数倍是一个更好的主意价值(例如,以美分而不是美元的形式存储所有东西),这样你就可以绕过对小额金钱的任何需求(这使得小美分 - 呃,有道理)。当然,如果你在做百分比,或者转换,那么是的,NSDecimalNumber 确实是一个不错的选择。
【解决方案2】:

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

_c = [_f doubleValue] / 5 * 8;

或:

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

希望对你有帮助

【讨论】:

    【解决方案3】:

    NSNumbers 不能应用数学符号。在您的情况下,您的代码实际上看起来像这样,而是使用 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 之上使用它们。
    • @ItaiFerber 不正确。使用 NSDecimalNumber 的一个主要优点是它的精度,即使对于上述的小型计算,精度所需的开销也非常有用,并且它具有放入数组而不是原始类型的优点。也不要忘记使用 NSNumber 的 -doubleValue 的乘法是非常有损的,并且会导致相当多的精度损失,例如1/5 * 5 != 1,你也不必担心整数到整数的除法。利大于弊,这就是我选择 NSDecimalNumber 的原因
    • 虽然我同意你的观点,它们确实有自己的优势,但我认为它们不值得仅仅将某些东西乘以 5/8——这种精度水平通常是不必要或不可取的.再说一次,我之所以不投反对票,并不是因为您建议使用 NSDecimalNumber(我觉得它们很有趣,并且希望更频繁地使用它们),而仅仅是因为我认为告诉还不知道区别的人会产生误导'这是做到这一点的方法'。看看我的回答,了解我的想法。
    • 此外,我不喜欢初始化NSDecimalNumber 的最简单方法是使用字符串这一事实——它会助长不良的编码习惯和风格。我当然不希望看到人们将数字硬编码到所有事物的 字符串 中(幻数已经够糟糕了!)。同样,它不是为新手准备的,而是为那些知道自己在做什么并对此有用的人准备的;它们不是非常容易使用是有原因的。
    • 我可以将值存储在浮点数中(我正在尝试制作温度转换器程序。)
    猜你喜欢
    • 1970-01-01
    • 2022-10-19
    • 2012-04-26
    • 2011-03-09
    • 2013-02-16
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多