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

149

В другом упражнении Брюса Экелса вычисление скорости, 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
Phill
источник
float v = s / t выполняет деление, а затем преобразовывает результат в число с плавающей точкой. float v = (float) s / t бросает на float, затем выполняет деление.
Хуан Карлос Итурриагоагития

Ответы:

307

Просто сначала бросьте один из двух операндов.

v = (float)s / t;

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

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

Альнитак
источник
8
Grrr, это заняло у меня около 30 минут, пока я нашел это и понял это. Так просто. : D
Рихардс
Более конкретно, это конкретное правило упоминается здесь: мультипликативные операторы , поэтому оставьте его здесь для дальнейшего использования.
квант
5
(Для тех, кто сталкивается с этим вопросом позже, указанные ссылки не работают. Новые: docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4 и docs. oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17 )
Стив Хейли,
13

Пытаться:

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

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

Вы действительно должны только разыграть одну, хотя.

Anisoptera
источник
Я не знаю, это все равно что сказать, что вы должны использовать long вместо its.
Якуб Заверка
4

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

v = (float)s / t;
Джейсон Коко
источник
4

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

v = 1d* s/t;
космический программист
источник
3

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

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

Джонни Д. Кано
источник
1
Обычно? Если они вообще вернутся, они собираются вернуть int.
Мэтью Флэшен
3

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

Uri
источник
1

Стандарт JLS

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

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

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

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

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

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

  • Если один из операндов имеет тип double, другой преобразуется в double.
  • В противном случае, если один из операндов имеет тип float, другой преобразуется в float.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
источник
0

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

1. v = (float)s / t;
2. v = (float)s / (float)t;
Нихил Кумар
источник
0

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

class CalcV 
{
      float v;
      float calcV(int s, int t)
      {
          float value1=s;
          float value2=t;
          v = value1 / value2;
          return v;
      } //end calcV
}
Я могу вам чем-нибудь помочь
источник