арифметическое выражение оценивается в ноль, когда с круглыми скобками - PullRequest
1 голос
/ 03 февраля 2012

У меня есть приведенный выше код

private float farenaitCelsiusMath(float f) {

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

, когда я запускаю приложение на эмуляторе, оно оценивается как 0, какое бы значение я ни присвоил f.

Но когда третья строка равна result = (f-1)*2/3; он оценивает правильно.

Почему это происходит?Что я должен знать об арифметических выражениях в Java?

1 Ответ

3 голосов
/ 03 февраля 2012

Поскольку (2/3) - это целочисленное деление, которое равно 0, поскольку целочисленное деление усекается.

  • (f-1) - это FLOAT, поскольку f - это FLOAT
  • (2/3) -Значение INTEGER 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 из-за десятичной запятой - или даже лучшесделайте это явным с помощью приведения ((float)2/(float)3). Это ничего не стоит во время выполнения, все это делает компилятор.

...