Jak przekonwertować liczbę całkowitą na zmiennoprzecinkową w Javie?


82

Mam dwie liczby całkowite xi y. Muszę obliczyć x/yi jako wynik chciałbym uzyskać float. Na przykład jako wynik 3/2chciałbym mieć 1.5. Myślałem, że najłatwiej (lub jedynym) sposobem na to jest konwersja xi ydo typu float. Niestety nie mogę znaleźć na to prostego sposobu. Czy mógłbyś mi w tym pomóc?


8
wynik float = ((float) x) / y?
mibollma,



1
@VinAy: bym nie polecam, że w tym przypadku. BigDecimalnie jest uniwersalnym zamiennikiem float.
Matt Ball

1
@VinAy: To zależy całkowicie od celu. Jeśli zajmuje się finansami, masz rację. Jeśli on oblicza trajektorie asteroid, ty nie.
user207421

Odpowiedzi:


153

Wystarczy rzucić co najmniej jeden z operandów na zmiennoprzecinkowy:

float z = (float) x / y;

lub

float z = x / (float) y;

lub (niepotrzebne)

float z = (float) x / (float) y;

Czy to jest bardziej wydajne niż: float z = (1,0 * x) / y; ? Czy konwersja typu float jest wewnętrznie bardziej wydajna niż mnożenie? Tnx!
MSquare

1
Nie wiem, ale myślę, że w 99% lub więcej przypadków nie ma to znaczenia. To nawet nie będzie wąskim gardłem. Jeśli naprawdę jesteś tym zaniepokojony, sprawdź to sam.
Matt Ball,

1
Pierwsza i druga spowodują błędy w niektórych urządzeniach z ramionami, upewnij się, że rzutujesz obie liczby całkowite.
Oliver Dixon

Nie można rzutować java.lang.Integer na java.lang.Float
asp

2
@ user3002853 przeczytaj o typach pudełkowych i elementach pierwotnych. docs.oracle.com/javase/tutorial/java/data/autoboxing.html
Matt Ball,

5

Nie powinieneś używać float, chyba że musisz. W 99% przypadków lepszym wyborem jest podwójne.

int x = 1111111111;
int y = 10000;
float f = (float) x / y;
double d = (double) x / y;
System.out.println("f= "+f);
System.out.println("d= "+d);

wydruki

f= 111111.12
d= 111111.1111

Po komentarzu @ Matta.

float ma bardzo małą dokładność (6-7 cyfr) i dość łatwo pokazuje znaczący błąd zaokrąglenia. double ma kolejne 9 cyfr dokładności. Koszt użycia double zamiast float jest hipotetyczny w 99% przypadków, jednak koszt subtelnego błędu spowodowanego błędem zaokrąglania jest znacznie wyższy. Z tego powodu wielu programistów w ogóle nie zaleca używania zmiennoprzecinkowych i zdecydowanie zaleca BigDecimal.

Jednak uważam, że w większości przypadków można użyć podwójnego, pod warunkiem że zastosowane zostanie rozsądne zaokrąglenie .

W tym przypadku int x ma 32-bitową precyzję, podczas gdy float ma 24-bitową precyzję, nawet dzielenie przez 1 może spowodować błąd zaokrąglenia. double z drugiej strony ma 53-bitową precyzję, która jest więcej niż wystarczająca, aby uzyskać dość dokładny wynik.


6
Powinieneś wyjaśnić, dlaczego double jest lepsze niż float.
Matt Ball

5

Musisz tylko przenieść pierwszą wartość do float, zanim zostanie zaangażowana w dalsze obliczenia:

float z = x * 1.0 / y;

4

// Liczba całkowita, którą chcę przekonwertować

int myInt = 100;

// Rzutowanie liczby całkowitej na zmiennoprzecinkową

float newFloat = (float) myInt

1
przynajmniej w Android Studio kompilator będzie narzekał na niezgodne typy próbujące to zrobić.
Adam R. Turner

3

Oto jak możesz to zrobić:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    int x = 3;
    int y = 2;
    Float fX = new Float(x);
    float res = fX.floatValue()/y;
    System.out.println("res = "+res);
}

Do zobaczenia !


7
Używanie typu wrappera ( Float) jest do tego całkowicie niepotrzebne.
Matt Ball,

1
Proszę nie używać podpisów lub sloganów w swoich postach.
meagar

1

Sameer:

float l = new Float(x/y)

nie zadziała, ponieważ najpierw obliczy dzielenie całkowite x i y, a następnie utworzy z tego liczbę zmiennoprzecinkową.

float result = (float) x / (float) y;

Jest semantycznie najlepszym kandydatem.


Twoja odpowiedź powinna być komentarzem. Sameer nie otrzyma powiadomienia o Twoim poście. Z semantycznego punktu widzenia konwersja obu int na zmiennoprzecinkowe przed obliczeniem wyniku jest niepotrzebna - dlatego nie jest lepsza niż przekształcenie tylko jednej. Sprawia mylne wrażenie i dlatego jest gorsza, imho.
użytkownik nieznany
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.