Frage von Phantom6208, 80

Java - warum ist 100 / -150 = 0?

Wenn ich folgenden Code ausführe:

int a = 100;
int b = -150;
    
double c = a / b;
    
System.out.println(c);

Ist das Ergebnis 0. Warum? Eigentlich müsste doch

-0.66666...

Herauskommen oder?

Antwort
von HellasPlanitia, 52

Du dividierst zwei Integer. Dabei wird die Integerdivision angewandt, auch bekannt als ganzzahlige Division. Beim Ergebnis werden dabei alle Nachkommastellen abgeschnitten. So ergibt die Integerdivision von 5 dividiert durch 2 tatsächlich 2. Das Fliesskommazahlenergebnis wäre 2,5, die Kommastellen werden aber abgetrennt und das Ergebnis ist wieder ein Integer.

Erst bei der Zuweisung zur Fliesskommavariablen c wird das Integer-Ergebnis in eine Kommazahl umgewandelt. Da die Nachkommastellen in dem Moment aber schon weg sind, bleibt das Ergebnis bei 0.

Du kannst das verhindern, indem du mindestens einen der Integerwerte in der Division zu einer Fliesskommazahl machst, dann wird automatisch eine Fliesskommazahl als Ergebnis erzeugt.

Kommentar von grtgrt ,

Wenn du statt

double c = a / b;


besser

                             double c = ( 1.0 * a )/( 1.0 * b )

schreibst, sollte das von dir gewünschte Ergebnis erscheinen (es wird dann nämlich durch die Multiplikation mit 1.0 die ganze Zahl zu einer Fließkommazahl).

Kommentar von HellasPlanitia ,

Stimmt, aber das ist relativ umständlich und unnötig. Entweder macht man aus a und b gleich von Beginn weg doubles, oder, falls man es bei Integern belassen will, erfüllen

double c = (double) a / b

oder

double c = a / (double) b

den Zweck. Natürlich können auch beide Variablen gecastet werden, aber es ist unnötig - eine der beiden reicht.

Antwort
von varlog, 49

Integer durch Integer ist immernoch ein Integer, auch wenn du es hinterher in einen double schreibst.

double c = a / (double) b
löst das Problem.

Kommentar von Phantom6208 ,

Danke

Kommentar von poldi1405 ,

wird das nicht automatisch definiert? bei Addition/Substraktion/Multiplikation von Integer kommt Integer raus und bei Division kommt doch float raus

Kommentar von ceevee ,

Nö. In der Grundschule hast du sicher mal irgendwann die ganzzahlige Division gehabt, also z.B. dass 10 / 3 = 3, Rest 1 ergibt. Und genau das passiert hier auch.

Kommentar von PWolff ,

Es gibt Programmiersprachen, die bei einer Division Zähler und Nenner immer vorher in floats umwandeln. Java gehört nun mal nicht dazu.

Das hat auch seinen Sinn, da Ganzzahl-Operationen meistens deutlich schneller sind als Gleitkomma-Operationen und der Compiler nicht davon ausgehen darf, dass etwas anderes herauskommen können darf, wenn das Ergebnis einem float anstatt einem integer zugewiesen wird.

Kommentar von maximilianus7 ,

ob das einen sinn macht, ist meinungssache.
objektiv ist das eine versteckte fehlerquelle. bösartig, da solche fehler bei einem test nicht auffallen. daher ist ein - wenn auch unbekannter - anteil javaprogramme fehlerhaft. und da java so beliebt ist, wird auch das eine oder andere im cockpit und zur steuerung von atomkraftwerken eingesetzt. heissa!

wenn ich ein programm beschleunigen will, muss ich gezielt nach den engpässen suchen. nach unbekannten fehlern sucht niemand.

Keine passende Antwort gefunden?

Fragen Sie die Community