Java Nachkommastellen entfernen

Hannibal Smith

Jumbo Frame
Registriert
Apr. 2015
Beiträge
1.182
Huhu :)

ich bin gerade dabei für unsere KA zu lernen und da unser Thema schleifen sein wird hab ich folgende Aufgabe bearbeitet, komme allerdings nicht weiter:

Ich gebe eine Zahl ein und bekomme alle ganzzahligen Teiler dieser Zahl ausgegeben.
zB: 8 = 8, 4, 2, 1

Version 1:
Code:
import Prog1Tools.IOTools;

public class Teiler {
  
  public static void main(String[] args) {
    double nbr, erg;
    int i, x;
    erg=0;
    i=  0;
    
    nbr=IOTools.readDouble("Bitte geben sie die Gewuenschte Zahl ein: ");
    
    do {
      erg= nbr/i;
        i++;
    System.out.println("Die Zahl "+nbr+" hat den Teiler: "+erg+" !");              
    } while (erg>1);                                     
    
    
  } // end of main

} // end of class Teiler
Ergebnis:
Version 1.PNG

Version 2:
Code:
import Prog1Tools.IOTools;

public class Teiler {
  
  public static void main(String[] args) {
    double nbr, erg;
    int i, x;
    erg=0;
    i=  0;
    
    nbr=IOTools.readDouble("Bitte geben sie die Gewuenschte Zahl ein: ");
    
    do {
      erg= nbr/i;
        i++;
    System.out.println("Die Zahl "+nbr+" hat den Teiler: "+Math.round(erg)+" !");              
    } while (erg>1);                                     
    
    
  } // end of main

} // end of class Teiler
Ergebnis:
Version 2.PNG

Version 3:
Code:
import Prog1Tools.IOTools;

public class Teiler {
  
  public static void main(String[] args) {
    double nbr, erg;
    int i, x;
    erg=0;
    i=  0;
    
    nbr=IOTools.readDouble("Bitte geben sie die Gewuenschte Zahl ein: ");
    
    do {
      erg= nbr/i;
        i++;
    System.out.println("Die Zahl "+nbr+" hat den Teiler: "+erg+" !");              
    } while (erg>1 && nbr%i==0);                                    
    
    
  } // end of main

} // end of class Teiler
Ergebnis:
Version 3.PNG

Was muss ich tun um nur die ganzzahligen Teiler ausgegeben zu bekommen ? Ich weis momentan echt nicht weiter
 
Dafür sollte einfach ein erg= (int) nbr/i; reichen.
Dein Ergebnis ist ein double und dein i ist ein int -> daraus macht Java einen Double wenn du keinen Cast ausführst.
 
SymA hat unrecht, so funktioniert das nicht. Sein Vorschlag entspricht deiner Version 2.

Du hast es quasi schon selbst, allerdings das modulo an der falschen Stelle eingesetzt (siehe Version 3).
Allerdings solltest du nicht die Schleife vom Ergebnis des Modulos abhängig machen, sondern die Ausgabe des Textes. Dämmert es nun? :p

Durch 0 sollte man natürlich nicht teilen und der Teiler ist "i", nicht "erg".
 
Zuletzt bearbeitet:
Wenn du eine elegante Lösung möchtest, so empfehle ich die Modulo Rechnung:
double nbr;
int erg;
i = 1;
...
erg = nbr%i;
if(erg == 0) sysout("Ein Teiler von " + nbr + "ist: " + i );

Modulo (%) zeigt dir nämlich den Rest an. Und durch die Abfrage, ob ein Rest vorhanden ist, kannst du alle Teiler herausfinden, ohne die "krummen" Teiler auszugeben

Edit: und deine while-Schleife sollte die Abbruchbedingung i<nbr sein, sonst hast du eine Endlosschleife ;)
 
Zuletzt bearbeitet: (Fehlerkorrektur)
Okay ich versuch mal was ihr mir erklärt habt ... klingt auch recht logisch :D

Danke schonmal für die Hilfe hatte schon Angst dass ich keine bekomm :)
 
zu spät...
 
Zuletzt bearbeitet:
Ist zwar in C#, sollte aber übertragbar sein.


Code:
            int input = 8;

            for (int teiler = 1; teiler <= input; teiler++)
            {
                var ergebnis = input % teiler;
                if (ergebnis == 0) Console.WriteLine($"{teiler}");
            }
 
Code:
   import Prog1Tools.IOTools;
     
    public class Teiler {
      
      public static void main(String[] args) {
        double nbr, erg;
        int i;
        erg=0;
        i=  0;
        
        nbr=IOTools.readDouble("Bitte geben sie die Gewuenschte Zahl ein: ");
        
        do {
          erg = nbr%i;
              if (nbr==0) {
               System.out.println("Die Zahl "+nbr+" hat den Teiler: "+Math.round(erg)+" !");
              } // end of if
          i++;            
        } while (i<nbr);                                     
        
        
      } // end of main
     
    } // end of class Teiler

ich habs jz mal so gemacht wie von @ProGamer empfohlen allerdings kommt als ausgabe nun nichts
 
wow, da hab ich selber gelaggt, sorry. ja, da sollte erg stehen, ich editier das mal richtig hin
 
Okay ich habs mal verbessert und jetzt funktioniert es ... halb.
Er spuckt mir in der Ausgabe nicht die zahl nbr selbst als teiler aus.
Bei 8 hab ich nur die Teiler 1, 2, 4 die 8 als teiler fehlt
 
while(i<=nbr), sonst springt die Schleife vorzeitig raus.
Uns ansonsten wie bereits Daniel gesagt hat: i auf 1 initiieren, weil du sonst eigentlich eine Exception kriegen solltest, wenn du durch 0 teilst.

Ansonsten wäre vllt noch relevant, dass du eine Double-Zahl ausließt, wodurch du bei Zahlen wie 23.3 mit dem aktuellen Verfahren keine Lösungen kriegen würdest. Je nach Aufgabenstellung macht es dann Sinn entweder einen Integer stattdessen auszulesen/ einzugeben, oder deinen Teiler zu modifizieren (Nachkommastellen dazu addieren z.b.)
 

Ähnliche Themen

W
  • Geschlossen
  • Frage
2 3
Antworten
45
Aufrufe
2.798
Antworten
10
Aufrufe
776
Zurück
Oben