Frage von BenStudio, 40

Java: Wie kann ich sehen ob eine Zahl zu den natürlichen gehört?

Folgender Fall: Ich habe zwei zufällig generierte ints x und y. Wenn ich mir jetzt das Ergebnis, welches durch Division von x durch y entsteht auf der Konsole ausgebe, kommt immer ein ganzzahliges Ergebnis: zB. bei 3 durch 6 Null, da eig 0,5 rauskommt, daraus aber ein Int gebildet wird, also 0.

(Es geht nicht darum ob die Zahl gerade oder ungerade ist, sondern ob es eine natürliche Zahl ist!!)

Nun will ich, wissen ob dieses Ergebnis, wie oben, abgerundet wurde oder ob wirklich die ausgebene Zahl das Ergebnis ist, wie es zB. bei 8 durch 4 der Fall wäre.

Das wäre mein Lösungsansatz, dieser geht aber nicht: System.out.print((8/3)-2);

Hier versuche ich x(8) durch y(3) zuteilen dabei kommt das int 2 raus teoretisch sollte hier also eine zahl über Null rauskommen, es kommt aber Null raus. Wo ist der Fehler?

Danke für Lösungen

Antwort
von NoHumanBeing, 16

Ob eine Ganzzahldivision aufgeht, findest Du mit dem Modulo-Operator "%" heraus. Dieser bestimmt den Rest, der bei der Ganzzahldivision verbleibt. Ist dieser Rest null, so ist der linke Operand ein Vielfaches des rechten Operanden.

int a = 8;
int b = 3;

if ((a % b) == 0)
System.out.println("a ist ein Vielfaches von b. (Oder auch: b teilt a.)");
else
System.out.println("a ist kein Vielfaches von b. (Oder auch: b teilt nicht a.)");

Das wäre die korrekte Lösung für dieses Problem.

Wenn Du bei einer Division hingegen eine Kommazahl herausbekommen möchtest, musst mindestens einer der Operanden ("aus Konvention" wandelt man in der Regel den Dividenden um) in eine Gleitkommazahl umgewandelt werden.

int a = 8;
int b = 3;
double c = (double)a / b;

Allerdings solltest Du diese Gleitkommadivision nicht dazu benutzen, um zu prüfen, ob c eine Ganzzahl ist (keinen Nachkommaanteil aufweist). Gleitkommazahlen werden vom Rechner intern logarithmisch (genauer: halblogarithmisch) dargestellt (deswegen ist ihr Wertebereich so groß). Logarithmen sind in der Regel irrationale Zahlen. Gleitkommaoperationen sind daher in der Regel fehlerbehaftet. Es kann Dir also passieren, dass Du bei einer Gleitkommaoperation kein Ergebnis wie 3.0 herausbekommst, sondern etwas, wie 3.000000000000000743209... oder 2.9999999999999992834293..., obwohl das exakte Ergebnis der Operation 3.0 wäre.

Die Größe des relativen Fehlers einer Gleitkommaoperation wird durch die so genannte "Maschinengenauigkeit" abgeschätzt. Ob eine Gleitkommadivision "aufgeht" (keinen Nachkommaanteil hat), sagt daher nicht unbedingt etwas aus. Schon die Operanden werden oft nicht exakt repräsentiert, das Ergebnis der Operation dann noch viel weniger.

Antwort
von resdaXallfVL, 17

Frage was hat das -2 in der Klammer der print Anweisung zu suchen? weil wenn da eig 2 Rauskommen würde, würde das -2 ja da 8/3 = 2 R:3 2-2=0 ergeben. 

Analog könnte man mit einer normalen division arbeiten und das ergebnis dann in einen integer umwandeln.

Oder 8/3 mit normaler Division d.h. nicht ganzzahlig und dann 8%3 von dem ersten ergebnis abziehen, dann müsste man einen integer rausbekommen. % ist modulo operator (jedenfalls bei c++)

Antwort
von xdxderich, 22

Probier mal etwas mit "%" zu machen ... Wenn man z.B. 3%6 als Rechnung nimmt, bekommt man 5... Also das, was hinter dem Komma steht... Ich glaube zumindest, dass das so war ^^ Für irgendwas in der Richtung war % auf jeden Fall da...

Antwort
von CalvinSchneider, 22

du müstest 8.0f/3.0f    (8.0f/3 würde auch reichen)
schreiben da bei einer divison zweier int-zahlen das ergebnis ein integer ist und das wird notfalls gekürzt (2.7->2)

wieso rechnest du nicht gleich in float und rundest ganz am ende?

Kommentar von BenStudio ,

mhm okey danke

Kommentar von CalvinSchneider ,

informier dich nochmal zu den datentypen und wann etwas implizit konvertiert wird und wann man etwas explizit konvertieren muss

Kommentar von NoHumanBeing ,

Gleitkommazahlen (floats) sollte man nicht für "exakte" Operationen ("teilbar oder nicht" ist eine "exakte" Entscheidung - entweder es ist teilbar oder eben nicht - da gibt es keine "Toleranz") verwenden, da Operationen mit ihnen in aller Regel fehlerbehaftet sind.

Schon Gleitkommazahlen auf Gleichheit zu prüfen, macht keinen wirklichen Sinn, weil sie selten exakt gleich sein werden, auch wenn bei einer analytischen (exakten) Berechnung Gleichheit eintreffen würde.

Kommentar von CalvinSchneider ,

das ist mir alles bewusst aber die frage war was an seine code nicht funktioniert bzw. warum da null raus kommt, somit ist meine antwort richtig. schön ist sie nicht aber ich würde das problem eh anderst lösen

Kommentar von BenStudio ,

Wie denn? ;)

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten