Java: Wie kann man erkennen ob ein ganzzahliger Wert beim Teilen von ints auftritt?
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.
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.
Danke für Lösungen
3 Antworten
x und y können beliebige positive oder negative Werte annehmen (außer natürlich den Werten in den Überprüfungen auf arithmetische Fehler):
/* Hier beliebige Werte einsetzen: */
int x = 512;
int y = 8;
/* Prüfung auf Division durch Null: */
if (0 == y) {
throw new ArithmeticException("division by zero");
}
/* Prüfung auf -2147483648 / -1: */
if (-1 == y && Integer.MIN_VALUE == x) {
throw new ArithmeticException("integer overflow");
}
/* Prüfung ob Ergebnis < 1 oder ungerade: */
if (Math.abs(x) >= Math.abs(y) && 0 == (x % y)) {
System.out.println("Even! :)");
} else {
System.out.println("Odd! :(");
}
Disclaimer: Es ist jetzt 03:30 Morgens und ich bin ziemlich müde, habe aber das dumpfe Gefühl, dass die Hauptüberprüfung in der Zeile mit dem Modulo-Operator überkomplex ist. Vielleicht kann ja nochmal jemand etwas dazu sagen, der ausgeschlafener ist, als ich im Moment. :)
Gute Nacht! :)
PS: In einem Kommentar auf eine andere Antwort hat der Fragensteller geschrieben, dass ihn nur die natürlichen Zahlen interessieren, was negative Zahlen ausschließt.
In so einem Falle müsste man nur noch die Überprüfung auf Null im Dividenden durchführen, und kann das ganze wie folgt verkürzen:
int x = 512;
int y = 8;
System.out.format("Das Ergebnis von %d / %d ist ", x, y);
if (0 == y) {
System.out.println("nicht definiert! ><");
} else if (x >= y && 0 == (x % y)) {
System.out.println("eine natürliche Zahl! :)");
} else {
System.out.println("eine rationale Zahl! :(");
}
Um zwei Zahlen dividieren zu können, solltest du sie als float oder double angeben. Dividierst du 2 ints kommt immer der gerundete Wert raus.
Also weißt du 2 float / double Variablen einen Zufallswert zu, den du in int umwandelst (der Teil hinterm Komma wird abgeschnitten).
...
Um zu prüfen, ob es sich bei einer Zahl um eine natürliche Zahl handelt, würde ich die beiden Abfragen machen:
if (ergebnis >= 0)
if (ergebnis == (int)ergebnis)
ergebnis <= 0 solltest du natürlich nur bei der Abfrage zu natürlichen Zahlen nehmen... :)
Damit sollte es eigentlich funzen...
Warum sollte das unnötig sein? Wenn du Math.random anwendest kommt standardmäßig ein float oder double wert raus
und den kannst du in int casten, um eine zufällige Ganzzahl zu bekommen. Eine doppelte Umwandlung wäre echt unnötig. Eine große Fehlerquelle haben wir also nicht.
Und das ist ein möglicher Weg. Klar, es gibt noch andere. Aber gerade für Java Anfäger, der der Fragesteller zu sein scheint, ist dein Weg nicht gerade geeignet.
Und das mit dem unnötig solltest du weiter verdeutlichen anstatt nur so daherzureden. Ganz unnötig ... sollte man auf gar keinen Fall so machen und so...
maal angenommen du subtrahierst das Ergebnis mit der Int Zahl. Wenn Ergebniss = 0 dann ist es Int Zahl, wenn Rest bleibt also nicht Null ist es Bruch oder so
Die links haben nichts mit meiner Frage zu tun... Ich will Wissen ob das Ergebnis zu der Familie der natürlichen Zahlen gehoert...
Eine Umwandlung in double und zurück ist äußerst ineffizient, und float sogar eine riesige Fehlerquelle, wegen Überläufen.
Das Ganze ist äußerst unnötig und man sollte es auf gar keinen Fall so machen.