2010-11-04 21 views
20

Sto facendo moltiplicazione e divisione di float se int s e ho dimenticato le regole di conversione implicite (e le parole nella domanda sembrano troppo vaghe per google più rapidamente rispetto a chiedere qui).conversione implicita float/int

Se ho due int s, ma voglio eseguire la divisione in virgola mobile, è necessario solo eseguire il cast di uno o entrambi gli operandi? Che ne dici della moltiplicazione? Se moltiplichi uno float e uno int, la risposta è una float?

+0

BTW, dovresti essere in grado di scrivere un metodo Java <10-line che verifica ciò per te. –

+4

concordato, ma non ho un imbrago di prova veloce e sporco per questo perché l'unica cosa che faccio con Java è creare progetti Android in Eclipse, quindi non saprei nemmeno (senza cercare) come creare un semplice app della linea cmd in Java. Più veloce per chiedere qui e ottenere una risposta in letteralmente secondi mentre continuo a lavorare. =) – Rich

+2

Ma ora tutti sulla terra non devono testarlo. –

risposta

31

Non è possibile assegnare a un int risultato di divisione di un float da un int o viceversa.

Quindi le risposte sono:

Se ho due int s, ma voglio fare la divisione in virgola mobile ...?

Un calco è sufficiente.

Se moltiplico un float ed un int, è la risposta di un float?

Sì, lo è.


float f = 1000f; 
int i = 3; 

f = i; // Ok 
i = f; // Error 

f = i/f; //Ok 0.003 
f = f/i; //Ok 333.3333(3) 

i = i/f; //Error 
i = f/i; //Error 
7

Per eseguire qualsiasi tipo di aritmetica in virgola mobile con numeri interi, è necessario convertire (leggi: cast) almeno uno degli operandi in un tipo float.

+4

+1, per concisione – Bozho

10

Per dimostrare:

int i1 = 5; 
float f = 0.5f; 
int i2 = 2; 
System.out.println(i1 * f); 
System.out.println(i1/i2); 
System.out.println(((float) i1)/i2); 

risultati:

2.5 
2 
2.5 
+0

Ho aggiunto delle parentesi aggiuntive per eliminarlo, grazie – Bozho

7

Se almeno uno degli operandi ad un operatore binario è di virgola mobile tipo, l'operazione è un'operazione virgola mobile, anche se l' altro è solidale .

(Fonte: Java language specifications - 4.2.4)

se moltiplico un galleggiante e un int, è la risposta un galleggiante?

System.out.println(((Object)(1f*1)).getClass());//class java.lang.Float 

(Se si utilizza DrJava, è sufficiente digitare ((Object) (1f * 1)). GetClass() nel pannello interazioni. C'è un plugin per DrJava per Eclipse troppo.)

5

La risposta semplice è che Java eseguirà automaticamente le conversioni in ampliamento senza restringere le conversioni. Quindi per esempio int-> float è automatico ma float-> int richiede un cast.

0

Java classifica i tipi primitivi nell'ordine int < long < float < double.Se un operatore viene utilizzato con diversi tipi primitivi, il tipo che appare prima dell'altro nell'elenco sopra verrà convertito implicitamente all'altro, senza alcuna diagnostica del compilatore, anche nei casi in cui ciò provocherebbe una perdita di precisione. Ad esempio, 16777217-1.0f genererà 16777215.0f (uno in meno del valore corretto). In molti casi, le operazioni tra un float e un int al di fuori dell'intervallo +/- 16777216 devono essere eseguite mediante il cast dello int su double, l'esecuzione dell'operazione e, se necessario, il risultato su float. Trovo fastidioso il requisito per il doppio casting, ma le regole di typecasting in Java richiedono che si usi il doppio cast fastidioso o si subisca la perdita di precisione.

Problemi correlati