2010-11-04 13 views
20

Ich mache Multiplikation und Division von float s und int s und ich vergesse die impliziten Konvertierungsregeln (und die Wörter in der Frage scheinen zu vage, um schneller googeln als hier zu fragen).float/int implizite Konvertierung

Wenn ich zwei int s, aber ich möchte Floating-Point-Division tun, brauche ich nur einen oder beide der Operanden zu werfen? Wie wäre es mit der Multiplikation - wenn ich eine float und eine int multipliziere, ist die Antwort a float?

+0

Übrigens sollten Sie in der Lage sein, eine <10-Zeilen Java-Methode zu schreiben, die das für Sie testet. –

+4

einverstanden, aber ich habe keine schnelle und dreckige Test-Harness für diese, weil das einzige, was ich jemals mit Java mache Android-Projekte in Eclipse zu erstellen, so dass ich nicht einmal wissen würde (ohne nachzuschlagen), wie man ein einfaches erstellt cmd Zeilen-App in Java. Schneller hier zu fragen und im wahrsten Sinne des Wortes eine Antwort zu bekommen, während ich weiterarbeite. =) – Rich

+2

Aber jetzt muss nicht jeder auf der Erde das testen. –

Antwort

31

Sie können ein zu einem int Ergebnis aus der Division eines float von int oder umgekehrt nicht zuordnen.

So sind die Antworten:

Wenn ich zwei int s haben, aber ich will Gleitkommadivision tun ...?

Ein Guss ist genug.

Wenn ich einen float und ein int vermehren, ist die Antwort ein float?

Ja ist es.


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

Um eine beliebige Fließkommaarithmetik mit Ganzzahlen auszuführen, müssen Sie mindestens einen der Operanden in einen float-Typ konvertieren (lesen: umwandeln).

+4

+1, für Prägnanz – Bozho

10

Um demonstrieren:

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); 

Ergebnis:

2.5 
2 
2.5 
+0

Ich habe zusätzliche Klammern hinzugefügt, um das zu löschen, danke – Bozho

7

Wenn mindestens einer der Operanden an einen Binäroperator ist von Gleitkommazahlen Typ, dann ist die Operation eine Gleitkommaoperation, auch wenn die andere integral .

(Quelle: Java language specifications - 4.2.4)

wenn ich einen Schwimmer und einen int multiplizieren, ist die Antwort ein Schwimmer?

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

(Wenn Sie DrJava verwenden, können Sie einfach eingeben ((Object) (1f * 1)). GetClass() in die Wechselwirkungen Panel. Es ist ein Plugin für DrJava für Eclipse auch.)

5

Die einfache Antwort ist, dass Java Erweiterungen automatisch erweitert, aber keine Conversions einschränkt. So ist zum Beispiel int-> float automatisch, aber float-> int erfordert eine Umwandlung.

0

Java ordnet primitive Typen in der Reihenfolge int < long < float < double.Wenn ein Operator mit verschiedenen primitiven Typen verwendet wird, wird der Typ, der in der obigen Liste vor dem anderen auftritt, implizit in den anderen konvertiert, ohne eine Compiler-Diagnose, selbst in Fällen, in denen dies zu einem Genauigkeitsverlust führen würde. Zum Beispiel ergibt 16777217-1.0f 16777215.0f (eins weniger als der korrekte Wert). In vielen Fällen sollten Operationen zwischen einem float und einem int außerhalb des Bereichs +/- 16777216 durchgeführt werden, indem der int auf double geworfen wird, die Operation durchgeführt wird, und dann - falls erforderlich - das Ergebnis auf float übertragen wird. Ich finde die Anforderung an das Doppel-Casting ärgerlich, aber die Typisierungsregeln in Java verlangen, dass man entweder den störenden Doppel-Cast verwendet oder den Verlust der Präzision erleidet.

Verwandte Themen