Schleifenfehler?

JavaNull99

Mitglied
Guten Morgen zusammen.

Steh mal wieder vor einem Problem.
In der Aufgabe geht es darum, dass eine Suppe eine Temperatur von 92 Grad hat und die Zimmertemp beträgt 20 Grad. Es soll ein Programm geschrieben werden das die Suppentemp für jede Minute berechnet, wenn man davon ausgeht, dass die Suppentemp jede Minute um 10% der Differenz zwischen
Suppentemp und Zimmertemp runter geht.

Java:
public class Suppentemperatur 
{
	public static void main(String[] args) 
	{
		double Zimmertemp = 20;
		double Suppentemp=92;
		double Ergebnis;
		
		while (Suppentemp>Zimmertemp)
		{
			Suppentemp =Suppentemp- (((Suppentemp-Zimmertemp)/100)*10);
			System.out.println(Suppentemp);
			
		}
	}

}

Von der Rechnung her müsste es so ja passen, aber es funktioniert mit der Schleife nicht. Das Programm spuckt dann laufend 20.0000000004 aus. Wo liegt der Fehler?

Grüße
 

Degget

Mitglied
Liegt meiner Meinung nach daran, dass du mit double rechnest. Caste zu int oder benutze gleich int, dann werden es auch 20 statt 20,000004. Double rechnet halt genau. Außerdem werden Variablennamen klein geschrieben :)
 

Landei

Top Contributor
Genau verkehrtrum, double rechnet eben nicht genau. Und casten zu int würde die Sache noch viel ungenauer machen.

Es ist so: Du berechnest eine unendliche Reihe, die irgendwann zu 20 konvergieren müsste. Aber wenn die Differenz zwischen den Temperaturen zu klein wird, wird die eigentliche Berechnung von Rundungsfehlern (eben weil double nicht "genau" ist) überdeckt. Nun kannst du entweder fünf gerade sein lassen und eine untere Schranke angeben (Mal ehrlich, hast du schon mal ein Thermometer gesehen, das auf 10 Stellen nach dem Komma misst?), du brichst also bei 20.01 oder so ab. Ein anderes Kriterium wäre nicht "Suppentemp>Zimmertemp" sondern "letzte Suppentemperatur > aktuelle Suppentemperatur", bei der du aufhörst, wenn sich am Ergebnis nichts mehr ändert (also mathematisch ein Fixpunkt erreicht wird), dazu musst du dir das letzte Ergebnis aber in einer weiteren Variable "merken".

Oder du verwendest BigDecimal, das beliebig "genau" rechnet und siehst zu, wie der Rechner irgendwann in die Knie geht, weil die 20 ja nie wirklich erreicht wird.

Variablennamen schreibt man übrigens klein.
 
Zuletzt bearbeitet:
T

Tomate_Salat

Gast
Oder du rundest bei der Prüfung:

Java:
public class Suppe
{
	public static void main(String[] args)
	{
		double 	zimmerTemp	= 20, 
				suppeTemp	= 92;
		int minuten		= 0;
		
		while(zimmerTemp < Math.round(suppeTemp) )
		{
			suppeTemp	-= (suppeTemp-zimmerTemp)*0.1;
			minuten++;
			System.out.printf("Temperatur %.2f°C\n",suppeTemp);
		}
		
		System.out.println("Zeit: " + minuten + " minuten");
	}
}

Ausgabe:
Code:
Temperatur 84,80°C
Temperatur 78,32°C
Temperatur 72,49°C
Temperatur 67,24°C
Temperatur 62,52°C
Temperatur 58,26°C
Temperatur 54,44°C
Temperatur 50,99°C
Temperatur 47,89°C
Temperatur 45,10°C
Temperatur 42,59°C
Temperatur 40,33°C
Temperatur 38,30°C
Temperatur 36,47°C
Temperatur 34,82°C
Temperatur 33,34°C
Temperatur 32,01°C
Temperatur 30,81°C
Temperatur 29,73°C
Temperatur 28,75°C
Temperatur 27,88°C
Temperatur 27,09°C
Temperatur 26,38°C
Temperatur 25,74°C
Temperatur 25,17°C
Temperatur 24,65°C
Temperatur 24,19°C
Temperatur 23,77°C
Temperatur 23,39°C
Temperatur 23,05°C
Temperatur 22,75°C
Temperatur 22,47°C
Temperatur 22,23°C
Temperatur 22,00°C
Temperatur 21,80°C
Temperatur 21,62°C
Temperatur 21,46°C
Temperatur 21,31°C
Temperatur 21,18°C
Temperatur 21,06°C
Temperatur 20,96°C
Temperatur 20,86°C
Temperatur 20,78°C
Temperatur 20,70°C
Temperatur 20,63°C
Temperatur 20,57°C
Temperatur 20,51°C
Temperatur 20,46°C
Zeit: 48 minuten

Anmerkung:
Genau verkehrtrum, double rechnet eben nicht genau. Und casten zu int würde die Sache noch viel ungenauer machen.

Bei int wäre das Ergebnis 25 minuten. (wer zu faul zum Scrollen ist: bei dem obigen code kommen 48 minuten raus)

MFG

Tomate_Salat
 
Zuletzt bearbeitet von einem Moderator:
T

Tomate_Salat

Gast
Java:
public class Suppe
{
	public static void main(String[] args)
	{
		double 	zimmerTemp	= 20, 
				suppeTemp	= 92;
		int minuten		= 0;
		
		while(zimmerTemp < round(suppeTemp, 1) )
		{
			suppeTemp	-= (suppeTemp-zimmerTemp)*0.1;
			minuten++;
			System.out.printf("Temperatur %.2f°C\n",suppeTemp);
		}
		
		System.out.println("Zeit: " + minuten + " minuten");
	}
	
	public static double round(double zahl, int stellen)
	{
		return Math.round(zahl*Math.pow(10, stellen))/ Math.pow(10, stellen);
	}
}

Code:
Temperatur 84,80°C
Temperatur 78,32°C
Temperatur 72,49°C
Temperatur 67,24°C
Temperatur 62,52°C
Temperatur 58,26°C
Temperatur 54,44°C
Temperatur 50,99°C
Temperatur 47,89°C
Temperatur 45,10°C
Temperatur 42,59°C
Temperatur 40,33°C
Temperatur 38,30°C
Temperatur 36,47°C
Temperatur 34,82°C
Temperatur 33,34°C
Temperatur 32,01°C
Temperatur 30,81°C
Temperatur 29,73°C
Temperatur 28,75°C
Temperatur 27,88°C
Temperatur 27,09°C
Temperatur 26,38°C
Temperatur 25,74°C
Temperatur 25,17°C
Temperatur 24,65°C
Temperatur 24,19°C
Temperatur 23,77°C
Temperatur 23,39°C
Temperatur 23,05°C
Temperatur 22,75°C
Temperatur 22,47°C
Temperatur 22,23°C
Temperatur 22,00°C
Temperatur 21,80°C
Temperatur 21,62°C
Temperatur 21,46°C
Temperatur 21,31°C
Temperatur 21,18°C
Temperatur 21,06°C
Temperatur 20,96°C
Temperatur 20,86°C
Temperatur 20,78°C
Temperatur 20,70°C
Temperatur 20,63°C
Temperatur 20,57°C
Temperatur 20,51°C
Temperatur 20,46°C
Temperatur 20,41°C
Temperatur 20,37°C
Temperatur 20,33°C
Temperatur 20,30°C
Temperatur 20,27°C
Temperatur 20,24°C
Temperatur 20,22°C
Temperatur 20,20°C
Temperatur 20,18°C
Temperatur 20,16°C
Temperatur 20,14°C
Temperatur 20,13°C
Temperatur 20,12°C
Temperatur 20,10°C
Temperatur 20,09°C
Temperatur 20,08°C
Temperatur 20,08°C
Temperatur 20,07°C
Temperatur 20,06°C
Temperatur 20,06°C
Temperatur 20,05°C
Temperatur 20,05°C
Zeit: 70 minuten

Zufrieden der Herr :pueh::D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
neerual Deklarations- und Schleifenfehler Java Basics - Anfänger-Themen 22

Ähnliche Java Themen


Oben