2009-04-24 10 views
101

En otro ejercicio de Bruce Eckels para calcular la velocidad, v = s/t donde s y t son números enteros. ¿Cómo lo hago para que la división genere un flotador?¿Cómo hacer que la división de 2 entradas produzca un flotante en lugar de otro int?

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 

Respuesta

219

Simplemente coloque primero uno de los dos operandos en un flotador.

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 se convertirá automáticamente en un flotante por el compilador porque las reglas dicen que si cualquiera de los dos operandos es de tipo coma flotante, entonces la operación será de coma flotante, incluso si el otro operando es integral. Java Language Specification, §4.2.4 y §15.17

+7

Grrr, esto me llevó unos 30 minutos hasta que encontré esto y pensó fuera. Tan sencillo. : D – Rihards

+0

Más específicamente, esta regla particular se menciona aquí: [Operadores multiplicadores] (http://java.sun.com/docs/books/jls/third%5Fedition/html/expressions.html#239829), así que déjalo párate aquí para referencia futura. – quantum

+5

(Para cualquier persona que se encuentre con esta pregunta más adelante, los enlaces dados están rotos. Los nuevos son: http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2 .4 y http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17) –

2

Puede emitir el numerador o el denominador flotar ...

operaciones int generalmente volver int, por lo que tiene que cambiar uno de los números operanding.

+1

por lo general? Si regresan, van a regresar int. –

9

Probar:

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

casting los enteros a los flotadores permitirá la división de coma flotante para tomar su lugar.

Sin embargo, en realidad solo necesita lanzar uno.

+0

No lo sé, es como decir que deberías usar largos en lugar de enteros. –

3

Emite uno de los enteros de un flotante para forzar la operación a realizar con matemática de coma flotante. De lo contrario, siempre se prefiere la matemática entera. Por lo tanto:

v = (float)s/t; 
3

Puedes lanzar incluso sólo uno de ellos, pero la consistencia es posible que desee convertir explícitamente tanto así que algo como v = (float) s/(float) t debería funcionar.

4

para disminuir el impacto en readabilty código, me gustaría sugerir:

v = 1d* s/t; 
0

moldeada uno de los enteros/tanto del número entero a flotar para forzar la operación que se realiza con punto flotante de matemáticas. De lo contrario, las matemáticas enteras siempre son preferidas. Así :

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

JLS estándar

JLS 7 15.17.2. Division Operator / dice:

La división entera redondea hacia 0.

Esta es la razón por 1/2 no da un flotador.

la conversión solo sea uno de flotar como en (float)1/2 es suficiente porque 15.17. Multiplicative Operators dice:

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

y 5.6.2. Binary Numeric Promotion dice:

  • Si cualquiera de los operandos es del tipo double, el otro es conv erted para duplicar.
  • De lo contrario, si alguno de los operandos es de tipo float, el otro se convierte a flotar
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 
} 
Cuestiones relacionadas