Variablen Abbruchbedingung: Dezimalzahl

Semikolon123

Mitglied
Hi,
ich wollte grade eine do while Schleife erstellen die solange läuft wie Variable x keine Kommazahl ist. Ich hatte die Idee den Restwertoperator zu nutzen und das sah dann wie folgt aus: while (x%2==0); .
Das Problem ist allerdings, dass dadurch ungerade Zahlen die Schleife auch stoppen was nicht sein sollte.
Habt ihr Ideen wie ich das Problem lösen kann?
 
do while Schleife erstellen die solange läuft wie Variable x keine Kommazahl ist
Was hast du vor? Typischerweise erhält man wegen der Fließkommaarithmetik so gut wie nie exakte ganze Zahlen. (Meintest du x%1==0 ? )

Bsp:
Java:
System.out.println(5.3%1); // liefert 0.2999999999999998
 
Zuletzt bearbeitet:
Kennst du dich zufällig aus mit Wirtschaft bzw. alternativen Bestellmengen? 🙂
Sagt mir noch nichts. Google spuckt nur was von optimaler Bestellmenge aus... Ich vermute hier kann man auch einfach auf-, abrunden oder zur vorherigen bzw nächsten ganzen Zahl gehen? Die letzten beiden Operationen gibt's in der Math-Klasse unter dem Namen floor und ceil.
Erläutere mal was (genau) das Problem ist und was die Schleife tun soll, vielleicht gibt es da einen besseren Ansatz.
 
Ja, der richtige Name hierzu ist die Optimale Bestellmenge. Es geht darum die billigsten Gesamtkosten zu ermitteln. Dazu muss man auch gucken wie oft man Ware bestellen muss damit die Kosten am niedrigsten sind. Wenn du zum Beispiel zu oft Waren bestellst gehen die Kosten in die Höhe und genau das selbe wenn du zu selten bestellst. Ich hoffe du kannst meine grobe Beschreibung der Problematik verstehen. Hier ist mein Code:

Java:
public class Class_optimaleBestellmenge
{
  // Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen
  private double gesamtbedarf_im_jahr;
  private double einstandspreis;
  private double lagerkostensatz;
  private double bestellfixekosten;
  private double alternativeBestellmenge;
  private double Anzahl_der_Bestellungen_imJahr;
  private double durchschnittlicher_Lagerbestand;
  private double Lagerkosten_im_jahr;
  private double BFK;
  private double gesamtkosten;
  private double kleinstmöglicheBestellmenge;
  private String ausgabeText;
  /**
  * Konstruktor für Objekte der Klasse Class_optimaleBestellmenge
  */
  public Class_optimaleBestellmenge()
  {
    gesamtbedarf_im_jahr=0;
    einstandspreis=0;
    lagerkostensatz=0;
    bestellfixekosten=0;
    alternativeBestellmenge=0;
    Anzahl_der_Bestellungen_imJahr=0;
    durchschnittlicher_Lagerbestand=0;
    Lagerkosten_im_jahr=0;
    BFK=0;
    gesamtkosten=0;
    kleinstmöglicheBestellmenge=1;
    ausgabeText="";
  }
  
  public void erfasse(double gesamtbedarf_im_jahr, double einstandspreis, double lagerkostensatz, double bestellfixekosten){
    this.gesamtbedarf_im_jahr=gesamtbedarf_im_jahr;
    this.einstandspreis=einstandspreis;
    this.lagerkostensatz=lagerkostensatz;
    this.bestellfixekosten=bestellfixekosten;
  }
  
  public void berechne() {
    alternativeBestellmenge=gesamtbedarf_im_jahr;
    
    do{
      
      Anzahl_der_Bestellungen_imJahr=gesamtbedarf_im_jahr/alternativeBestellmenge;
      
      durchschnittlicher_Lagerbestand=(alternativeBestellmenge/2)*einstandspreis;
      Lagerkosten_im_jahr= durchschnittlicher_Lagerbestand/100*lagerkostensatz;
      BFK=Anzahl_der_Bestellungen_imJahr*bestellfixekosten;
      gesamtkosten=Lagerkosten_im_jahr+BFK;
      
      
      ausgabeText+=(alternativeBestellmenge+"\t"+ Anzahl_der_Bestellungen_imJahr+"\t"+durchschnittlicher_Lagerbestand
      +"\t"+Lagerkosten_im_jahr+"\t"+BFK+ "\t"+gesamtkosten)+"\n"; 
      alternativeBestellmenge=alternativeBestellmenge/2;
      
    }while (alternativeBestellmenge%1==0);
  }
  public String toString(){
    
    return(ausgabeText);
  }
}
 
Ja, der richtige Name hierzu ist die Optimale Bestellmenge. Es geht darum die billigsten Gesamtkosten zu ermitteln. Dazu muss man auch gucken wie oft man Ware bestellen muss damit die Kosten am niedrigsten sind. Wenn du zum Beispiel zu oft Waren bestellst gehen die Kosten in die Höhe und genau das selbe wenn du zu selten bestellst. Ich hoffe du kannst meine grobe Beschreibung der Problematik verstehen. Hier ist mein Code:

Java:
public class Class_optimaleBestellmenge
{
  // Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen
  private double gesamtbedarf_im_jahr;
  private double einstandspreis;
  private double lagerkostensatz;
  private double bestellfixekosten;
  private double alternativeBestellmenge;
  private double Anzahl_der_Bestellungen_imJahr;
  private double durchschnittlicher_Lagerbestand;
  private double Lagerkosten_im_jahr;
  private double BFK;
  private double gesamtkosten;
  private double kleinstmöglicheBestellmenge;
  private String ausgabeText;
  /**
  * Konstruktor für Objekte der Klasse Class_optimaleBestellmenge
  */
  public Class_optimaleBestellmenge()
  {
    gesamtbedarf_im_jahr=0;
    einstandspreis=0;
    lagerkostensatz=0;
    bestellfixekosten=0;
    alternativeBestellmenge=0;
    Anzahl_der_Bestellungen_imJahr=0;
    durchschnittlicher_Lagerbestand=0;
    Lagerkosten_im_jahr=0;
    BFK=0;
    gesamtkosten=0;
    kleinstmöglicheBestellmenge=1;
    ausgabeText="";
  }
 
  public void erfasse(double gesamtbedarf_im_jahr, double einstandspreis, double lagerkostensatz, double bestellfixekosten){
    this.gesamtbedarf_im_jahr=gesamtbedarf_im_jahr;
    this.einstandspreis=einstandspreis;
    this.lagerkostensatz=lagerkostensatz;
    this.bestellfixekosten=bestellfixekosten;
  }
 
  public void berechne() {
    alternativeBestellmenge=gesamtbedarf_im_jahr;
   
    do{
     
      Anzahl_der_Bestellungen_imJahr=gesamtbedarf_im_jahr/alternativeBestellmenge;
     
      durchschnittlicher_Lagerbestand=(alternativeBestellmenge/2)*einstandspreis;
      Lagerkosten_im_jahr= durchschnittlicher_Lagerbestand/100*lagerkostensatz;
      BFK=Anzahl_der_Bestellungen_imJahr*bestellfixekosten;
      gesamtkosten=Lagerkosten_im_jahr+BFK;
     
     
      ausgabeText+=(alternativeBestellmenge+"\t"+ Anzahl_der_Bestellungen_imJahr+"\t"+durchschnittlicher_Lagerbestand
      +"\t"+Lagerkosten_im_jahr+"\t"+BFK+ "\t"+gesamtkosten)+"\n";
      alternativeBestellmenge=alternativeBestellmenge/2;
     
    }while (alternativeBestellmenge%1==0);
  }
  public String toString(){
   
    return(ausgabeText);
  }
}
Die Variable ausgabeText ist nur für die GUI 🙂
 
Okay, vermutlich gehört das zum Algorithmus, aber ich frage trotzdem mal nach:
Warum wird die Bestellmenge immer halbiert?
ich hab das Gefühl Du willst gar nicht solange wiederholen, bis du eine ganze Zahl erwischst, sondern einfach solange alternative Bestellmenge >= 1 ist?
Zusätzlich suchst du, wenn ich das richtig verstehe, hier nicht direkt die optimale Bestellmenge, sondern erzeugst eine Art Tabelle. (Es scheint ja auch Formeln für die opt. Menge zu geben, etwa hier )
 
Das ist ein Optimierungsproblem, bei dem du doch einfach versuchst, das Minimum der Gesamtkostenfunktion zu finden. Wenn man schon Analysis in der 11./12.? Klasse hatte, weiß man, dass man dies durch das Lösen der ersten Ableitung der Kostenfunktion analytisch finden kann. Außerdem: Was hat das denn damit zu tun, ob nun eine Variable ganzzahlig wird?
Ich würde also erstmal die Kostenfunktion und ihre Ableitung analytisch ermitteln. Dann die Ableitung null setzen und zur Bestellmenge auflösen. Theoretisch müsste man noch die zweite Ableitung bilden, um zu gucken, ob es ein Minimum und kein Maximum ist, aber die Kostenfunktion wird nur ein Minimum und kein Maximum haben.
 
Okay, vermutlich gehört das zum Algorithmus, aber ich frage trotzdem mal nach:
Warum wird die Bestellmenge immer halbiert?
ich hab das Gefühl Du willst gar nicht solange wiederholen, bis du eine ganze Zahl erwischst, sondern einfach solange alternative Bestellmenge >= 1 ist?
Zusätzlich suchst du, wenn ich das richtig verstehe, hier nicht direkt die optimale Bestellmenge, sondern erzeugst eine Art Tabelle. (Es scheint ja auch Formeln für die opt. Menge zu geben, etwa hier )
Ich will einfach das Programm so lange laufen lassen wie alternative Bestellmenge keine Kommazahl ist, weil wenn alternative Bestellmenge eine Kommazahl ist dann wird die Anzahl der Bestellungen die man im Jahr machen muss auch zu einer Kommazahl. Das darf ja nicht sein, da man keine halben Bestellungen machen sondern nur ganze.
 
Okay, vermutlich gehört das zum Algorithmus, aber ich frage trotzdem mal nach:
Warum wird die Bestellmenge immer halbiert?
ich hab das Gefühl Du willst gar nicht solange wiederholen, bis du eine ganze Zahl erwischst, sondern einfach solange alternative Bestellmenge >= 1 ist?
Zusätzlich suchst du, wenn ich das richtig verstehe, hier nicht direkt die optimale Bestellmenge, sondern erzeugst eine Art Tabelle. (Es scheint ja auch Formeln für die opt. Menge zu geben, etwa hier )
Aber du hast schon Recht, dass mit dem halbieren ist manchmal echt doof. Es funktioniert mit manchen Werten ganz gut, allerdings nicht immer.
 
Ich will einfach das Programm so lange laufen lassen wie alternative Bestellmenge keine Kommazahl ist, weil wenn alternative Bestellmenge eine Kommazahl ist dann wird die Anzahl der Bestellungen die man im Jahr machen muss auch zu einer Kommazahl. Das darf ja nicht sein, da man keine halben Bestellungen machen sondern nur ganze.
Aber das kannst du ja durch Auf/Ab-runden erreichen, ansonsten sind ganze Zahlen sehr selten. Genauer gesagt, falls du exakt rechnen würdest, kommen nur ganze Zahlen raus, wenn du bereits mit einer Zahl startest, die eine Zweiterpotenz beinhaltet.
 
Das Beispiel im Link gefällt mir - wir vergleichen mal zwei Methoden; ah, eine Abweichung von "nur" ca. 20 % -> ist also gleich *ROFL*
Oh, das hatte ich gekonnt ignoriert! Sind halt Wirtschaftler 😀. Die Formel ist aber das richtige Ergebnis. Die Tabelle ist einfach nicht genau genug aufgelöst, wegen den 1000er Schritten. Hätte man 100er Schritte genommen, käme man wohl auch so auf ein genaueres Ergebnis.
 
Oh, das hatte ich gekonnt ignoriert! Sind halt Wirtschaftler 😀. Die Formel ist aber das richtige Ergebnis. Die Tabelle ist einfach nicht genau genug aufgelöst, wegen den 1000er Schritten. Hätte man 100er Schritte genommen, käme man wohl auch so auf ein genaueres Ergebnis.
Ja, aber man hätte das Beispiel auch etwas "passender" wählen können 🙂
 
Wie gesagt, ich denke hier ist nicht die optimale Bestellmenge gesucht, sondern auch eine Art Tabelle... aber das kann wohl nur @Semikolon123 beantworten.
Ja, das stimmt allerdings ist die Tabelle auch gemacht um die Optimale Bestellmenge herauszufinden. Allerdings liest man die OB. aus der Tabelle heraus, aber ich weiss nicht welche Methode am besten ist um die Tabelle zu erstellen. Immer -1000? oder halbieren?
 
Also, was soll denn jetzt das Ergebnis sein? Eine Tabelle zu zeichnen, oder die optimale Bestellmenge (analytisch) zu ermitteln? Ich verstehe gerade die eigentlich Aufgabenstellung immer weniger.
 
Okay, dann ermittle doch erstmal die optimale Bestellmenge und dann mit einem Margin links und rechts noch ein paar weitere alternative Bestellmengen, die du dann zusammen mit ihren Kosten in einer Tabelle aufmalst.
Es bringt ja nichts, am Anfang zu raten, wie weit die Tabelle nun gehen müsste und mit welcher Granularität, um auch den optimalen Fall abzudecken/zu sehen.
 
Ja, das stimmt allerdings ist die Tabelle auch gemacht um die Optimale Bestellmenge herauszufinden. Allerdings liest man die OB. aus der Tabelle heraus, aber ich weiss nicht welche Methode am besten ist um die Tabelle zu erstellen. Immer -1000? oder halbieren?
Ich würde einfach folgendes tun:
Rechne das ganze für k=1,2,3,4,...,N Bestellungen mit der Größe Jahresbedarf/k durch. Natürlich ist dann "Jahresbedarf/k" keine ganze Zahl, aber ich denke das ist kein Problem, da kannst du einfach diese Zahl aufrunden.
 
Und wenn die optimale Bestellmenge nun nicht in deinem N drin ist? Was ist denn, wenn die optimale Bestellmenge erst bei 50.000 Bestellungen im Jahr erreicht ist. Willst du dann eine Tabelle malen, die mindestens 50.000 Zeilen hat?
 
Also praktisch das int i aus der for Schleife: Jahresbedarf /i;?
Noch hab ich keine for-Schleife gesehen, aber ja eine for-Schleife würde sich bei meinem Ansatz anbieten, beachte auch den Vorschlag von @httpdigest, ob der dir besser gefällt, denke, dass das ein "sauberer" Weg ist. Mein Ansatz würde man denk ich aber in einigen Wirtschaftsbüchern finden, ohne Ahnung von Wirtschaftstheorie zu haben ... 😀

Und wenn die optimale Bestellmenge nun nicht in deinem N drin ist? Was ist denn, wenn die optimale Bestellmenge erst bei 50.000 Bestellungen im Jahr erreicht ist. Willst du dann eine Tabelle malen, die mindestens 50.000 Zeilen hat?
@httpdigest Deine Kritik ist völlig berichtigt. Ich weiß nur auch nicht, ob sie die Formel überhaupt "benutzen" dürfen, wenn die Aufgabe lautet: Tabelle -> Optimum ablesen.
 
Noch hab ich keine for-Schleife gesehen, aber ja eine for-Schleife würde sich bei meinem Ansatz anbieten, beachte auch den Vorschlag von @httpdigest, ob der dir besser gefällt, denke, dass das ein "sauberer" Weg ist. Mein Ansatz würde man denk ich aber in einigen Wirtschaftsbüchern finden, ohne Ahnung von Wirtschaftstheorie zu haben ... 😀


@httpdigest Deine Kritik ist völlig berichtigt. Ich weiß nur auch nicht, ob sie die Formel überhaupt "benutzen" dürfen, wenn die Aufgabe lautet: Tabelle -> Optimum ablesen.
Es geht bei dieser Aufgabe auch nicht darum auf den Cent genau den besten Preis bzw. die beste Bestellmenge zu rechnen, sondern einen guten "Mittelwert" zu finden 🙂 . Ich denke mit dem Runden-Lösungsansatz fährt man ganz gut oder man könnte Parsing auch benutzten sprich Datentyp verändern?
 
Hier vielleicht nochmal die eigentliche Rechnung, um die optimale Bestellmenge zu berechnen.
Die Schritte:
1. Gesamtkosten als Funktion der alternativen Bestellmenge aufstellen
2. ableiten
3. null-setzen
4. Gleichung lösen
Code:
Gesamtkostenfunktion (ergibt sich direkt aus deinem Code - "menge"="alternativeBestellmenge"):
GK(menge) = menge / 2 * einstandspreis / 100 * lagerkostensatz + gesamtbedarf / menge * bestellfixkosten

Ableiten (nach 'menge'):
GK'(menge) = einstandspreis / 200 * lagerkostensatz - gesamtbedarf  / menge² * bestellfixkosten

Nullstelle ermitteln (GK'(menge) = 0 nach 'menge²' auflösen):
menge² = 200 * gesamtbedarf * bestellfixkosten / (einstandspreis * lagerkostensatz)

Das heißt, die optimale Bestellmenge ist:
optimal = sqrt(200 * gesamtbedarf * bestellfixkosten / (einstandspreis * lagerkostensatz))
 
Also ich hätte sowas in der Art gemacht:

Java:
class Main {
  public static void main(String[] args) {
    double yearlyNeed = 50000;
    int lastSize = -1;
    for(int orders = 1; orders <= yearlyNeed; orders++){
      int orderSize = (int)Math.ceil(yearlyNeed/orders);
      if (orderSize == lastSize){
        continue;
      }
      lastSize = orderSize;     
      System.out.println("Größe einer Bestellung: "+orderSize + " Anzahl der Bestellungen: "+ orders );
    }
    
  }
}
 

Zurück
Oben