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?
 

JCODA

Top Contributor
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:

JCODA

Top Contributor
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.
 

Semikolon123

Mitglied
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);
  }
}
 

Semikolon123

Mitglied
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 :)
 

JCODA

Top Contributor
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 )
 

httpdigest

Top Contributor
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.
 

Semikolon123

Mitglied
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.
 

Semikolon123

Mitglied
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.
 

JCODA

Top Contributor
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.
 

JCODA

Top Contributor
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 :D. 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.
 

mihe7

Top Contributor
Oh, das hatte ich gekonnt ignoriert! Sind halt Wirtschaftler :D. 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 :)
 

Semikolon123

Mitglied
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?
 

httpdigest

Top Contributor
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.
 

httpdigest

Top Contributor
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.
 

JCODA

Top Contributor
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.
 

httpdigest

Top Contributor
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?
 

JCODA

Top Contributor
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 ... :D

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.
 

Semikolon123

Mitglied
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 ... :D


@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?
 

httpdigest

Top Contributor
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))
 

JCODA

Top Contributor
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 );
    }
    
  }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Konsoleneingabe mit Abbruchbedingung beenden Java Basics - Anfänger-Themen 11
J Abbruchbedingung in Schleife/ Untersuchung von Strings Java Basics - Anfänger-Themen 2
F Abbruchbedingung einer For-Schleife Java Basics - Anfänger-Themen 5
F Methoden Abbruchbedingung bei Rekursion Java Basics - Anfänger-Themen 2
M Abbruchbedingung- Iteratives Verfahren Java Basics - Anfänger-Themen 3
S Abbruchbedingung Java Basics - Anfänger-Themen 11
A Frage zur Abbruchbedingung Rekursion Java Basics - Anfänger-Themen 8
A for Schleife Abbruchbedingung Java Basics - Anfänger-Themen 9
C Schleife mit Abbruchbedingung Java Basics - Anfänger-Themen 6
S Wuerfeln über Schleifen, Abbruchbedingung Java Basics - Anfänger-Themen 6
J Stackoverflow-Abbruchbedingung Java Basics - Anfänger-Themen 7
M EInfaches Addieren mit Abbruchbedingung Java Basics - Anfänger-Themen 9
G Abbruchbedingung für Timer Java Basics - Anfänger-Themen 3
R Abbruchbedingung readObject (deserialisieren) Java Basics - Anfänger-Themen 31
G Abbruchbedingung Java Basics - Anfänger-Themen 18
wofus Interface EditText Feld Multiline Dezimalzahl Java Basics - Anfänger-Themen 2
C Gleitkommazahl in Dezimalzahl umrechnen Java Basics - Anfänger-Themen 4
J Dezimalzahl in Bruch Umwandeln und Kürzen Java Basics - Anfänger-Themen 8
W Dezimalzahl in Binär umwandeln - Was sollte ich an meinem Programm verbessern? Java Basics - Anfänger-Themen 5
Aprendiendo Gibt es in der JAVA-API eine Funktion, die eine Dezimalzahl in eine binäre Zahl umwandelt? Java Basics - Anfänger-Themen 8
P Zeichenkette mit Binärzahl in Dezimalzahl umrechnen Java Basics - Anfänger-Themen 3
O Dezimalzahl in andere Zahlensysteme Java Basics - Anfänger-Themen 5
1 Binärdarstellung (als String) in Dezimalzahl umwandeln Java Basics - Anfänger-Themen 8
H inputfeld dezimalzahl mit komme statt punkt Java Basics - Anfänger-Themen 12
H OOP Dezimalzahl in Binärzahl mit GUI - Problem Java Basics - Anfänger-Themen 14
J Dezimalzahl in Binärdarstellung Java Basics - Anfänger-Themen 6
J Gleitkommazahl in Dezimalzahl umrechnen Java Basics - Anfänger-Themen 5
F Variablen Dezimalzahl oder doch nicht? Java Basics - Anfänger-Themen 5
D String mit 2 Stellen nach dem Komma (Dezimalzahl) Java Basics - Anfänger-Themen 9
D Umwandlung char -> dezimalzahl und ausgabe als int Java Basics - Anfänger-Themen 5
C Dezimalzahl in Dualzahl. Java Basics - Anfänger-Themen 11
S Regex für Dezimalzahl. Problem mit Nachkommastellen Java Basics - Anfänger-Themen 5
P Umrechnung von Basis b zu Dezimalzahl Java Basics - Anfänger-Themen 7
R dezimalzahl in hexadezimalzahl umwandeln Java Basics - Anfänger-Themen 14
G Dezimalzahl(integer) ziffernweise umdrehen Java Basics - Anfänger-Themen 3
G Binärzahl in dezimalzahl umwandeln Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben