C# und ganze Zahlen nach Division?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Abstand zur nächsten ganzen Zahl > eine kleine Rundungsdifferenz. Z. B.

 while (Math.Abs(rnddivtemp-Math.Round(rnddivtemp))>0.0001)

Aber das ist ziemlich rechenintensiv und wenig elegant.

Besser ist der Modulo-Operator (Rest einer Division; in C-artiger Syntax als "%" dargestellt):

while (RndNr3 % RndNr4 != 0)

Dann sparst du dir die Fließkomma-Variable komplett.

Woher ich das weiß:Berufserfahrung – Software-Entwickler

Xig90 
Fragesteller
 15.12.2016, 11:24

Cool danke. Das hat geklappt und der Code ist sogar schlanker als vorher :D

0
PWolff  15.12.2016, 11:26

Trotzdem würde ich eine Methode Divisors() definieren, die sämtliche Teiler einer gegebenen Zahl ermittelt.

int[] Divisors(int n) {...}

und dann ein zufällig gewähltes Element daraus wählen:

RndNr4 = (var divs=Divisors(RndNr3))[Rnd.Next(divs.Length)];

(weiß nicht, ob das so geht oder ob man divs in einer eigenen Zeile deklarieren und definieren muss)

0

Wenn Du wissen willst ob es einen Rest bei einer Integerdisision gibt, dann solltest Du nciht die Division durchführen sondern den Modulo Operator (%) verwenden. Der gibt näämlich den Rest der Division zurück.

Diesen Rest könntest Du dann auf 0 prüfen.

Der Datentyp des Rests ist selbstverständlich auch Integer.


Xig90 
Fragesteller
 15.12.2016, 11:08

Sowas wie das hier?

while (rnddivtemp%1 == 0);

Das habe ich bereits versucht. Der Interpreter ignoriert das aber munter...

0
martin0815100  15.12.2016, 11:10
@Xig90

Was soll diese Anweisung???

Du teilst durch 1 und prüfst den Rest? Das ist völlig sinnlos, irgendwas % 1 ist immer Null

0
FouLou  15.12.2016, 11:16
@Xig90

Weil du != 0 nehmen musst. Du machst ja weiter wenn ein rest da ist.

Natürlich läuft die schleife nur einmal durch weil nach dem ersten durchlauf es unwarscheinlich ist das du ne ganze zahl raushast.

0
Xig90 
Fragesteller
 15.12.2016, 11:18
@martin0815100

Wie gesagt ich lerne noch. Dazu kommt dass ich noch nicht genau hinter die Funktion des Modulo gekommen bin. Was wäre den eine gute Möglichkeit? Und glaub mir, ich hab schon nach Lösungen gesucht und der eine Vorschlag war einer davon.

0
PWolff  15.12.2016, 11:19
@Xig90

Merke: Fließkommazahlen vergleicht man niemals auf Gleichheit. Es können immer Rundungsdifferenzen enthalten sein.

Hab's grad mal getestet - (float % 1) geht zwar (ergibt ein float), aber man kann nie sicher sein, dass das Ergebnis richtig ist

Eigentlich sollte der Modulo-Operator nur für Ganzzahlen (und ggf. rationale Zahlen) verfügbar sein. Fließkommazahlen sollte man mit einer Fract-Methode behandeln (Fract(x) = x - Floor(x)), das verwirrt weniger, wenn man den Code später noch mal anschaut.

1
martin0815100  15.12.2016, 11:19
@FouLou

Lies doch mal seinen Text richtig.

Es ist doch nicht der Vergleic. Er benutzt doch die double Variable die bereits das Divisionsergebnis enthält teilt diese durch 1 und prüft auf einen Rest den es nicht geben wird weil der immer 0 ist.

Das ist einfach falsch.

TIPP: Lies Dir doch mal durch was ein Modulo Operator macht. Es bringt doch nichts wenn Du abschreibst. Das korrekte Ergebnis wurde hier bereits PWolff geschrieben. Aber Du musst auich verstehen was Du da tust. Bisher sieht das nicht so aus!

0
Xig90 
Fragesteller
 15.12.2016, 11:33
@martin0815100

Das stimmt schon und du hast auch recht dass ich zuerst wissen müsste was ich mache bevor ich es verwende. Jedoch lerne ich um ein vielfaches einfacher wenn ich Code sehe und was er verursacht und ihn dann auseinander nehme um die einzelnen Teile davon zu verstehen. Trotzdem danke für deinen Einsatz.

0
martin0815100  15.12.2016, 11:36
@Xig90

Das Problem ist, dass Du aber meinen Text gar nicht verstanden hast. Ist sagte, dass DU anstelle der Ganzzahldivision den Modulo Operator nehmen sollst. Du hast aber trotzdem die Division durchgeführt und das Ergebnis (eine Fliesskommazahl) mit Module 1 (ist quasi der Rest bei einer Division durch 1, der muss immer 0 sein) mit 0 verglichen.

Sinngemäß hast Du while (true) geschrieben.

Daher ist da kein Lerneffekt sondern eher ein falscher Weg im Irrgarten. Das bringt so gar nichts.

0

So geht das nicht, das Ergebnis ist zwnagsläufig double da der Datentyp so vorgegeben ist. Merke 3.0 ist auch double und nicht automatisch 3