1

我有上面的代码

private float farenaitCelsiusMath(float f) {

        float result;
        result = (f-1)*(2/3);
        return result;
    }

当我在模拟器上运行应用程序时,它评估为 0 无论我给 f 的值。

但是当它的第三行result = (f-1)*2/3;正确评估时。

为什么会这样?关于java中的算术表达式我应该知道什么吗?

4

1 回答 1

3

因为(2/3)是 INTEGER 除法,由于整数除法被截断,因此计算结果为 0。

  • (f-1)是 FLOAT 因为f是 FLOAT
  • (2/3)是整数值 0,因为整数除法会截断
  • (f-1)*(2/3)是 FLOAT,因为(f-1)是 FLOAT,并且值为 0,因为任何乘以 0 都是 0。

当它是(f-1)*2/3那么它评估为

  • (f-1)是 FLOAT,因为f是 FLOAT;
  • (f-1)*2是 FLOAT 因为 (f-1)是 FLOAT
  • (f-1)*2/3是 FLOAT 因为(f-1)*2是 FLOAT

为了得到你所期望的,让它(2./3)或者(2/3.)- 因为小数点而两者都被提升为 FLOAT - 或者甚至更好地使用 cast 使其明确((float)2/(float)3)。这在运行时不需要任何成本,这一切都由编译器完成。

于 2012-02-03T19:39:13.923 回答