¿Cómo hacer que la división de 2 ints produzca un flotador en lugar de otro int?

149

En otro ejercicio de Bruce Eckels para calcular la velocidad, v = s / tdonde syt son enteros. ¿Cómo hago para que la división produzca un flotador?

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
fuente
float v = s / t realiza la división y luego transforma el resultado en un flotante. float v = (float) s / t lanza a flotante y luego realiza la división.
Juan Carlos Iturriagagoitia

Respuestas:

307

Solo lanza uno de los dos operandos a un flotador primero.

v = (float)s / t;

El elenco tiene mayor prioridad que la división, por lo que sucede antes de la división.

El otro operando será efectivamente lanzado automáticamente a un flotante por el compilador porque las reglas dicen que si cualquiera de los operandos es de tipo de punto flotante, entonces la operación será una operación de punto flotante, incluso si el otro operando es integral. Especificación del lenguaje Java, §4.2.4 y §15.17

Alnitak
fuente
8
Grrr, esto me llevó unos 30 minutos hasta que encontré esto y lo descubrí. Tan sencillo. : D
Rihards
Más específicamente, esta regla en particular se menciona aquí: Operadores multiplicativos , así que déjelo aquí para referencia futura.
Quantum
55
(Para cualquiera que se encuentre con esta pregunta más adelante, los enlaces dados están rotos. Los nuevos son: docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4 y docs. oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17 )
Steve Haley
13

Tratar:

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

Lanzar las entradas a flotadores permitirá que tenga lugar la división de punto flotante.

Sin embargo, realmente solo necesitas lanzar uno.

anisoptera
fuente
No sé, es como decir que debes usar longs en lugar de ints.
Jakub Zaverka
4

Lanza uno de los enteros a un flotador para forzar que la operación se realice con matemática de coma flotante. De lo contrario, siempre se prefiere la matemática entera. Entonces:

v = (float)s / t;
Jason Coco
fuente
4

Para disminuir el impacto en la legibilidad del código, sugeriría:

v = 1d* s/t;
programador espacial
fuente
3

Puedes lanzar el numerador o el denominador para flotar ...

Las operaciones int generalmente devuelven int, por lo que debe cambiar uno de los números operantes.

Jhonny D. Cano -Leftware-
fuente
1
¿Generalmente? Si regresan, van a regresar int.
Matthew Flaschen
3

Puede lanzar incluso solo uno de ellos, pero por coherencia, es posible que desee emitir explícitamente ambos para que algo como v = (float) s / (float) t funcione.

Uri
fuente
1

Estándar JLS

JLS 7 15.17.2. División Operador / dice:

La división de enteros se redondea a 0. Es decir, el cociente producido para los operandos n y d que son enteros después de la promoción numérica binaria (§5.6.2) es un valor entero q cuya magnitud es lo más grande posible mientras satisface | d · q | ≤ | n |. Además, q es positivo cuando | n | ≥ | d | ynyd tienen el mismo signo, pero q es negativo cuando | n | ≥ | d | y nyd tienen signos opuestos.

Es por eso 1/2que no da un flotador.

Convirtiendo cualquiera de las dos para flotar como es (float)1/2suficiente porque 15.17. Los operadores multiplicativos dicen:

La promoción numérica binaria se realiza en los operandos.

y 5.6.2. La promoción numérica binaria dice:

  • Si cualquiera de los operandos es de tipo doble, el otro se convierte en doble.
  • De lo contrario, si cualquiera de los operandos es de tipo flotante, el otro se convierte en flotante
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
0

Emite uno de los enteros / ambos enteros para flotar para forzar que la operación se realice con matemática de coma flotante. De lo contrario, siempre se prefiere la matemática entera. Entonces:

1. v = (float)s / t;
2. v = (float)s / (float)t;
Nikhil Kumar
fuente
0

Prueba esto:

class CalcV 
{
      float v;
      float calcV(int s, int t)
      {
          float value1=s;
          float value2=t;
          v = value1 / value2;
          return v;
      } //end calcV
}
Puedo ayudarlo
fuente