2010-11-04 12 views
20

Wykonuję mnożenie i dzielenie float s i int s i zapominam o niejawnych regułach konwersji (a słowa w pytaniu wydają się zbyt niejasne, aby google szybciej niż pytać tutaj).niejawna konwersja float/int

Jeśli mam dwa int s, ale chcę wykonać podział zmiennoprzecinkowy, czy muszę tylko rzucić jeden lub oba operandy? Co powiesz na mnożenie - jeśli pomnożę liczbę float i int, czy odpowiedź jest float?

+0

BTW, powinieneś być w stanie napisać <10-liniową metodę Java, która przetestuje to dla ciebie. –

+4

zgodził się, ale nie mam do tego szybkiej i brudnej uprzęży testowej, ponieważ jedyną rzeczą, którą robię w Javie, jest tworzenie projektów Androida w Eclipse, więc nie wiedziałbym (bez sprawdzania) jak stworzyć prosty Aplikacja cmd line w Javie. Szybciej zapytać i uzyskać odpowiedź w dosłownie kilka sekund, podczas gdy ja nadal pracuję. =) – Rich

+2

Ale teraz wszyscy na Ziemi nie muszą tego sprawdzać. –

Odpowiedz

31

nie można przypisać do int związku z podziałem na float przez int lub vice versa.

więc odpowiedzi są:

Jeśli mam dwie int s, ale chcę zrobić zmiennoprzecinkowych podział ...?

Wystarczy jeden rzut.

Jeśli pomnożyć float oraz int, jest odpowiedzią float?

Tak jest.


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

Aby wykonać dowolną arytmetykę zmiennoprzecinkową z liczbami całkowitymi, należy przekonwertować (odczytać: odlany) przynajmniej jeden z operandów na typ float.

+4

+1, dla zwięzłości – Bozho

10

wykazać:

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

Wynik:

2.5 
2 
2.5 
+0

Dodałem dodatkowe klamry, aby to wyczyścić, dziękuję – Bozho

7

Jeżeli co najmniej jeden z argumentów do operatora binarnego jest zmiennoprzecinkową typu, to operacja jest operacją zmiennoprzecinkową, nawet jeśli drugi integralną .

(Źródło: Java language specifications - 4.2.4)

jeśli pomnożyć pływaka i int, jest odpowiedzią pływaka?

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

(Jeśli używasz DrJava, można po prostu wpisać ((Object) (1f * 1)). GetClass() na panelu interakcji. Jest to wtyczka do DrJava dla Eclipse też.)

5

Najprostszą odpowiedzią jest to, że Java będzie automatycznie zwiększać liczbę konwersji, ale nie zawężać konwersji. Na przykład int-> float jest automatyczne, ale float-> int wymaga rzutu.

0

Java szereguje prymitywne typy w kolejności int < long < float < double.Jeśli operator jest używany z różnymi typami pierwotnymi, typ, który pojawia się przed innym na powyższej liście, zostanie niejawnie przekonwertowany na inny, bez żadnej diagnostyki kompilatora, nawet w przypadkach, w których spowoduje to utratę precyzji. Na przykład 16777217-1.0f da 16777215.0f (jeden mniej niż poprawna wartość). W wielu przypadkach operacje między float i int poza zakresem +/- 16777216 należy wykonać, odlewając od int do double, wykonując operację, a następnie - w razie potrzeby - odrzucając wynik do float. Uważam, że wymóg podwójnego rzucenia jest irytujący, ale reguły typowania w języku Java wymagają, aby jeden z nich używał denerwującej podwójnej obsady lub cierpiał na utratę precyzji.

Powiązane problemy