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

... komplette Frage anzeigen

4 Antworten

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 bewerten Vielen Dank für Deine Bewertung

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 bewerten Vielen Dank für Deine Bewertung

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 bewerten Vielen Dank für Deine Bewertung

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?

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von BenStudio
02.01.2016, 18:31

mhm okey danke

1
Kommentar von NoHumanBeing
02.01.2016, 18:52

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.

1

Was möchtest Du wissen?