2009-04-24 17 views
101

In un altro esercizio di calcolo di Bruce Eckels, v = s/t dove s e t sono numeri interi. Come faccio a fare in modo che la divisione spinga fuori un galleggiante?Come rendere la divisione di 2 inte produce un float invece di un altro 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 

risposta

219

Basta eseguire il cast di uno dei due operandi per primo.

v = (float)s/t; 

Il cast ha una precedenza più alta rispetto alla divisione, quindi avviene prima della divisione.

L'altro operando verrà automaticamente convertito in un float dal compilatore perché le regole dicono che se uno degli operandi è di tipo floating point, l'operazione sarà un'operazione a virgola mobile, anche se l'altro operando è integrale. Java Language Specification, §4.2.4 e §15.17

+7

Grrr, questo mi ci sono voluti circa 30 minuti fino a quando ho trovato questo e capito fuori. Cosi 'semplice. : D – Rihards

+0

In particolare, questa regola particolare è menzionata qui: [Operatori moltiplicativi] (http://java.sun.com/docs/books/jls/third%5Fedition/html/expressions.html#239829), quindi lasciatelo stare qui per riferimento futuro. – quantum

+5

(Per chi arriva in seguito a questa domanda, i collegamenti indicati sono infranti. I nuovi sono: http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2 .4 e http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17) –

2

Si può lanciare il numeratore o il denominatore a stare a galla ...

operazioni int di solito tornare int, quindi bisogna cambiare uno dei numeri operanding.

+1

Di solito? Se ritornano, ritorneranno int. –

9

Prova:

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

Casting gli INT in carri permetterà divisione in virgola mobile avvenire.

In realtà, è sufficiente lanciarne uno solo.

+0

Non lo so, è come dire che dovresti usare long invece di inte. –

3

Cast uno degli interi in un float per forzare l'operazione da eseguire con la matematica in virgola mobile. Altrimenti, la matematica intera è sempre preferita. Quindi:

v = (float)s/t; 
3

Si può lanciare anche solo uno di loro, ma per coerenza si può decidere di lanciare esplicitamente sia così qualcosa come v = (float) s/(float) t dovrebbe funzionare.

4

per diminuire l'impatto sul codice readabilty, suggerirei:

v = 1d* s/t; 
0

Fusioni uno degli interi/sia del numero intero a galleggiare per forzare l'operazione da fare con la matematica in virgola mobile. Altrimenti, la matematica intera è sempre preferita. Quindi:

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

JLS standard

JLS 7 15.17.2. Division Operator / dice:

divisione Integer arrotonda verso 0.

Questo è il motivo per cui 1/2 non dà un galleggiante.

Conversione solo uno dei due a galleggiare come nel (float)1/2 basta perché 15.17. Multiplicative Operators dice:

promozione numerico binario viene eseguita su operandi

e 5.6.2. Binary Numeric Promotion dice:

  • Se uno degli operandi è di tipo double, l'altro è conv erted to double.
  • Altrimenti, se uno degli operandi è di tipo float, l'altro viene convertito a galleggiare
0

Prova questa:

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