Як змусити поділ на 2 int вивести 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

float v = s / t виконує ділення, а потім перетворює результат у float. float v = (float) s / t кидає плавати, потім виконує ділення.
Хуан Карлос Ітурріагагоїтія

Відповіді:


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 та документи. oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17 )
Стів Хейлі

13

Спробуйте:

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

Закидання вкладок плавцям дозволить здійснити поділ з плаваючою комою.

Вам дійсно потрібно лише віддати один.


Я не знаю, це як сказати, що вам слід використовувати довгі замість iof ints.
Якуб Заверка

4

Киньте одне з цілих чисел на поплавок, щоб змусити операцію робити з математикою з плаваючою комою. В іншому випадку математика завжди переважна. Так:

v = (float)s / t;


3

Ви можете кинути чисельник чи знаменник, що плаває ...

Операції int зазвичай повертають int, тому вам доведеться змінити одне з оперуючих номерів.


1
Зазвичай? Якщо вони взагалі повернуться, вони повернуться до int.
Меттью Флашен

3

Ви можете передавати навіть лише один із них, але для послідовності ви можете чітко видати обидва, щоб щось працювало як v = (float) s / (float) t.


1

JLS Standard

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. Бінарне числове просування говорить:

  • Якщо будь-який операнд типу подвійний, інший перетворюється на подвійний.
  • В іншому випадку, якщо будь-який операнд float типу, інший перетворюється на float

0

Закиньте одне з цілих чисел / обидва цілого числа на плаваючий, щоб змусити операцію виконувати з плаваючою точкою Math. Інакше цілий Math завжди є кращим. Так:

1. v = (float)s / t;
2. v = (float)s / (float)t;

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.