Как сделать, чтобы деление 2-х целых производило float вместо другого int? - PullRequest
131 голосов
/ 25 апреля 2009

В другом упражнении Брюса Экелса по вычислению скорости, v = s / t, где s и t - целые числа. Как мне сделать так, чтобы подразделение проворачивало поплавок?

class CalcV {
  float v;
  float calcV(int s, int t) {
    v = s / t;
    return v;
  } //end calcV
}

public class PassObject {

  public static void main (String[] args ) {
    int distance;
    distance = 4;

    int t;
    t = 3;

    float outV;

    CalcV v = new CalcV();
    outV = v.calcV(distance, t);

    System.out.println("velocity : " + outV);
  } //end main
}//end class

Ответы [ 9 ]

269 голосов
/ 25 апреля 2009

Сначала приведите один из двух операндов к числу с плавающей точкой.

v = (float)s / t;

Актер имеет более высокий приоритет, чем разделение, так происходит до разделения.

Другой операнд будет автоматически автоматически преобразован компилятором в число с плавающей точкой, поскольку в правилах сказано, что если любой операнд имеет тип с плавающей запятой, то операция будет операцией с плавающей запятой, даже если другой операнд является целым. Спецификация языка Java, §4.2.4 и §15.17

11 голосов
/ 25 апреля 2009

Попробуйте:

v = (float)s / (float)t;

Приведение чисел к числу с плавающей запятой позволит выполнить деление с плавающей запятой.

Тебе действительно нужно разыграть только одного.

4 голосов
/ 24 апреля 2012

Чтобы уменьшить влияние на читабельность кода, я бы предложил:

v = 1d* s/t;
3 голосов
/ 25 апреля 2009

Вы можете разыграть хотя бы одного из них, но для согласованности вы можете явно разыграть оба, чтобы что-то вроде v = (float) s / (float) t работало.

3 голосов
/ 25 апреля 2009

Приведите одно из целых чисел к числу с плавающей точкой, чтобы заставить операцию выполняться с помощью математики с плавающей запятой. В противном случае целочисленная математика всегда предпочтительнее. Итак:

v = (float)s / t;
2 голосов
/ 25 апреля 2009

Вы можете разыграть числитель или знаменатель, чтобы плавать ...

Операции int обычно возвращают int, поэтому вам нужно изменить одно из операндов.

1 голос

Стандарт JLS

JLS 7 15.17.2. Оператор подразделения / говорит:

Целочисленное деление округляет до 0. То есть частное, полученное для операндов n и d, которые являются целыми числами после двоичного числового продвижения (§5.6.2), является целочисленным значением q, величина которого максимально возможна при удовлетворении | d · д | ≤ | n |. Более того, q положительно, когда | n | ≥ | d | и n и d имеют одинаковый знак, но q отрицательно, когда | n | ≥ | d | и n и d имеют противоположные знаки.

Вот почему 1/2 не дает поплавка.

Достаточно конвертировать любой из них в число с плавающей точкой, как в (float)1/2, потому что 15.17. Мультипликативные операторы говорят:

Двоичное числовое продвижение выполняется над операндами

и 5.6.2. Двоичное числовое продвижение говорит:

  • Если один из операндов имеет тип double, другой преобразуется в двойной.
  • В противном случае, если один из операндов имеет тип float, другой преобразуется в float
0 голосов
/ 27 июня 2016

Попробуйте это:

class CalcV 
{
      float v;
      float calcV(int s, int t)
      {
          float value1=s;
          float value2=t;
          v = value1 / value2;
          return v;
      } //end calcV
}
0 голосов
/ 14 апреля 2015

Приведите одно из целых чисел / оба целых числа к числу с плавающей запятой, чтобы принудительно выполнить операцию с математическим вычислением с плавающей запятой. В противном случае целочисленное Math всегда является предпочтительным. Итак:

1. v = (float)s / t;
2. v = (float)s / (float)t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...