【问题标题】:Objective-C Integer ArithmeticObjective-C 整数运算
【发布时间】:2010-11-16 18:52:09
【问题描述】:

我正在尝试在 iPhone 应用程序中计算一些数字。

int i = 12;
int o = (60 / (i * 50)) * 1000;

在本例中,我希望 o 为 100(即毫秒),但 NSLog(@"%d", o) 显示它等于 0。

这也等于 0。

int o = 60 / (i * 50) * 1000;

这等于 250,000,这是从左到右的直接数学运算。

int o = 60 / i * 50 * 1000;

什么在我头上飞来飞去?

谢谢,
尼克

【问题讨论】:

标签: objective-c c math integer-division


【解决方案1】:

在 Objective-C 中/ 对整数参数执行整数除法,因此 4/5 被截断为 0,3/2 被截断为 1,依此类推。您可能希望在执行除法之前将一些数字转换为浮点形式。

您还遇到了优先级问题。在表达式中

60 / (i * 50) * 1000

首先计算括号内的项,因此 60 除以 600 得到结果 0。在

60 / i * 50 * 1000

第一个操作是将 60 除以 12,得到结果 5,然后进行乘法运算。

【讨论】:

  • 当然,C 也是如此。 Objective-C 中的算术与 C 中的算术相同。:)
  • 严格来说,结果不是四舍五入,是截断。
  • 嗯,截断是一种舍入形式(向零),所以...是的。
  • @Jonathan 对不起,但准确地了解这些事情会有所帮助。截断是一种舍入形式,就像整数除法是浮点除法的一种形式一样。如您所见,不知道差异可能会给您带来麻烦。
  • @Dima:Trucation 仅对未签名的地板等效。比较: floor(-5./2.) 和 -5/2。第一个是-3,但第二个是-2。截断 AKA 舍入为零,如果为正数为下限,则为负数为 ceil。这是细节,但它可能会让你感到困惑。
【解决方案2】:

一个整数除以一个整数就是一个整数。

所以60/600 不是0.1,而是0

将某些内容转换为(或声明)float

【讨论】:

  • 强制转换或引入到floatdouble 的隐式转换不是评估整数表达式的方法。在没有 IEEE 浮点的系统上,它可能会给出非常虚假的结果(C 对浮点实现的质量几乎没有要求),即使使用 IEEE 浮点,您也可能会因为整数太大而无法放入精度而导致错误使用的浮点类型。 OP问题的正确解决方案是简单地对表达式进行代数简化。
【解决方案3】:

它在做整数数学。 60 / (12 * 50) 为 0.1,截断为 0。

如果你强制浮点数然后转换回整数应该可以工作。

int o = (int)(60.0 / ((double) i / 50.0) * 1000.0;

可能没有必要让所有东西都变成双倍。

【讨论】:

  • 强制转换或引入到floatdouble 的隐式转换不是评估整数表达式的方法。请参阅我对戴夫回答的评论。
【解决方案4】:

替换:

int o = (60 / (i * 50)) * 1000;

与:

int o = 1200/i;

【讨论】:

  • 无论谁投反对票,请自行解释。与其他答案不同,此答案给出了精确的截断整数计算结果,没有由于溢出或精度损失而导致的任何极端情况。据我所知,这是这里唯一正确的答案。
【解决方案5】:

按优先顺序,操作:

60 / (12 * 50) 

在乘以 1000 之前执行。

此值小于 1 并被强制转换为 int,这会将其截断为 0。而0 次任何东西都是0

使用float 或先乘以1000,以确保您不会在计算中传播0

【讨论】:

    【解决方案6】:

    表达式中的所有运算都以整数算术执行,这意味着每个中间结果的小数部分都会被截断。这意味着如果你用一个较小的整数除以一个较大的整数,你总是会得到 0。

    要获得您想要的结果,您必须确保以特定顺序执行操作,或者您必须使用浮点数。例如

    的结果
    int o = (60.0 / (i * 50.0)) * 1000.0;
    

    应该是 o = 100。

    【讨论】:

      【解决方案7】:

      我认为你需要在这里使用 float 而不是 int。它会按照你想要的方式工作!也会给你小数的答案。

      【讨论】:

      • 虽然float 会起作用,但这并不能解决最初导致问题的误解!
      猜你喜欢
      • 2011-05-02
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 2015-05-09
      • 2012-11-07
      • 1970-01-01
      • 2010-10-11
      • 2012-12-04
      相关资源
      最近更新 更多