【问题标题】:BEDMAS precedence in (Obj-)C?(Obj-)C 中的 BEDMAS 优先级?
【发布时间】:2012-12-05 09:02:05
【问题描述】:

我刚刚解决了我在 iOS 应用程序中遇到的一个相当奇怪的问题。我需要对传递给方法的值应用一个比例因子(我计算为64/38 ~= 1.684)。

我的问题的症结是这样的:

- (void)applyScaleTo:(int)value {

    // value := 64
    int first = value * (64/38)
    NSLog(@"First: %d", first);
    int second = (64 * value)/38;
    NSLog(@"Second: %d", second);

}

所需值为107,但日志如下所示:

First: 64
Second: 107

我的解决方案是使用第二种方法,这很好,但我的问题是,为什么会出现这种差异? (顺便说一句,如果将first 更改为float,它仍然会记录为64.00000...。)

【问题讨论】:

  • 64/38,因为操作数是整数,所以是 1 - 将结果更改为浮点数不会改变计算。

标签: objective-c c math floating-point


【解决方案1】:

在第一种情况下,您将两个整数(64 和 38)相除,得到一个整数值(1)。 要纠正这一点,您不必将结果值更改为浮点数(这只会将您的 64 整数结果转换为浮点数),但至少需要一个除法操作符。

int first = value * ( (float) 64 / 38)

结果应该是 107

【讨论】:

  • 请注意,您也可以通过写为 64.f 来简单地将 64 声明为浮点常量。同样,所写的任何一种方法都会生成警告,因为结果会隐式转换回 int。
猜你喜欢
  • 1970-01-01
  • 2017-06-13
  • 2019-08-07
  • 1970-01-01
  • 2013-03-16
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多