Falsche Darstellung von Float

jopeter58

Mitglied
Hallo,
ich habe jetzt eine kleine Kaffeemaschine programmiert, welche über die Konsole läuft. Nun habe ich jedoch eine Frage. Wenn ich mein Programm ausführe und irgendein Programm wähle und einen Betrag kleiner als den Kaffeepreis eingebe und dann 0,01 €-Beträge eingebe, dann wird das Restgeld ganz komisch berechnet. Es wäre schön, wenn mir jemand erklären könnte, woran das liegt, denn wenn ich zum Beispiel Programm 1 gewählt habe, dann 0,50 € einwerfe, dann 0,01 €, 0,01€, 0,20€ und 0,05€, wird als Restbetrag 0.020000000000000018€ zurück gegeben. Warum ist das so? Könnte mir jemand sagen, wie ich das umgehen kann und wie es richtig berechnet werden kann?
Hier der Code dazu:
Java:
import java.util.Scanner;

public class ProgrammAusführen
{

	public static void main(String[] args)
	{
		//Variablen definieren
		byte programm=0;
		double guthaben = 0;
		double restgeld = 0;
		double betrag = 0;
		final double KAFFEEPREIS1 = 0.75;
		final double KAFFEEPREIS2 = 0.90;
		final double KAFFEEPREIS3 = 1.20;
		
		
		//Programmwahl
		Scanner scan = new Scanner(System.in);
		System.out.println("Bitte wählen sie ihr Programm: ");
		
		programm = scan.nextByte();
		
		System.out.println("Sie haben das Programm " + programm + " gewählt.");
		
		if (programm >= 1 && programm <= 3) {
			//Überprüfung, welches Programm gewählt wurde
			switch(programm)
				{
				//Kaffee 1
				case 1: programm = 1;
					{
						System.out.println("Bitte bezahlen sie: " + KAFFEEPREIS1 + "€");
						guthaben = scan.nextDouble();
						System.out.println("Ihr Guthaben beträgt " + guthaben + "€");
							while(guthaben < KAFFEEPREIS1)
								{
									System.out.println("Bitte werfen sie mehr geld ein." );
									betrag = scan.nextDouble();
									guthaben = guthaben + betrag;
									betrag = 0;
								}
							if (guthaben == KAFFEEPREIS1)
								{
									System.out.println("Vielen Dank, ihr Kaffee wird nun zubereitet." );									
								}
							if (guthaben > KAFFEEPREIS1)
								{
									System.out.println("Vielen Dank, ihr Kaffee wird nun zubereitet.");
									System.out.println("Nach den Zubereitungsvorgang erhalten sie ihr Restgeld.");
									restgeld = guthaben - KAFFEEPREIS1;
									System.out.println("Sie erhalten nun " + restgeld + "€ zurück.");
								}
						break;
					}
				//Kaffee 2
				case 2: programm = 2;
						{
							System.out.println("Bitte bezahlen sie: " + KAFFEEPREIS2 + "€");;
							guthaben = scan.nextDouble();
							System.out.println("Ihr Guthaben beträgt " + guthaben + "€");
							while(guthaben < KAFFEEPREIS2)
								{
									System.out.println("Bitte werfen sie mehr geld ein." );
									betrag = scan.nextDouble();
									guthaben = guthaben + betrag;
									betrag = 0;
								}
							if (guthaben == KAFFEEPREIS2)
								{
									System.out.println("Vielen Dank, ihr Kaffee wird nun zubereitet." );									
								}
							if (guthaben > KAFFEEPREIS2)
								{
									System.out.println("Vielen Dank, ihr Kaffee wird nun zubereitet.");
									System.out.println("Nach den Zubereitungsvorgang erhalten sie ihr Restgeld.");
									restgeld = guthaben - KAFFEEPREIS2;
									System.out.println("Sie erhalten nun " + restgeld + "€ zurück.");
								}
						break;
					}
				//Kaffee 3
				case 3: programm = 3;
						{
							System.out.println("Bitte bezahlen sie: " + KAFFEEPREIS3 + "€");
							guthaben = scan.nextDouble();
							System.out.println("Ihr Guthaben beträgt " + guthaben + "€");
								while(guthaben < KAFFEEPREIS3)
									{
										System.out.println("Bitte werfen sie mehr geld ein." );
										betrag = scan.nextDouble();
										guthaben = guthaben + betrag;
										betrag = 0;
									}
								if (guthaben == KAFFEEPREIS3)
									{
										System.out.println("Vielen Dank, ihr Kaffee wird nun zubereitet." );									
									}
								if (guthaben > KAFFEEPREIS3)
									{
										System.out.println("Vielen Dank, ihr Kaffee wird nun zubereitet.");
										System.out.println("Nach den Zubereitungsvorgang erhalten sie ihr Restgeld.");
										restgeld = guthaben - KAFFEEPREIS3;
										System.out.println("Sie erhalten nun " + restgeld + "€ zurück.");
									}
							break;
						}
			}
		scan.close();
		}
		else
		{
			System.out.println("Leider ist das von Ihnen gewählte Programm nicht vorhanden, bitte wählen sie ein anderes.");
		}
	}

}
Vielen Dank dafür schonmal. :)
 

rme

Top Contributor
Hallo :)

Die Datentypen float und double sind prinzipiell ungenau - das liegt daran, dass man einige Tricks anwenden musste, um reelle Zahlen zu speichern. Denn reelle Zahlen sind noch viel unendlicher, als natürliche Zahlen es schon sind - zwischen 0 und 1 liegen im Bereich der reellen Zahlen mehr Zahlen, es es natürliche Zahlen insgesamt gibt. Da man nicht unendlich viel Speicher hat, muss man eben Abstriche bei der Genauigkeit akzeptieren.

Du könntest die Ausgabe so gestalten, dann wird auf 2 Stellen nach dem Komma gerundet:
Java:
System.out.println(String.format("Sie erhalten nun %.2f € zurück.", restgeld));

String.format ersetzt dabei Platzhalter, die mit % anfangen, durch die danach aufgeführten Parameter. %f steht für Gleitkommazahlen und das .2 bedeutet, dass genau 2 Stellen angezeigt werden sollen, d.h. aus 3 wird dann 3.00 und aus 3.1000001 wird 3.10.

Eine andere Variante, die man in der Praxis anwenden würde, ist die Speicherung sämtlicher Daten in Cent-Beträgen, um auf doubles und floats vollständig verzichten zu können.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
T User input in Verbindung mit ChronoUnit anpassen und falls falsche Eingabe getätigtwird Java Basics - Anfänger-Themen 7
B Binärzahlen auflisten, falsche Ausgabe? Java Basics - Anfänger-Themen 1
Z Java ArrayList speichert falsche Daten ab bzw. gibt falsche Daten aus? Java Basics - Anfänger-Themen 42
volcanos HashSet und Iterator -> Falsche Sortierreihenfolge ? Java Basics - Anfänger-Themen 18
O Falsche Antworten zu Fragen Java Basics - Anfänger-Themen 4
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
D falsche eingabe erkennen Java Basics - Anfänger-Themen 2
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
JaVaN0oB Wörterraten - Falsche Ausgabe, String/Chars vergleichen Java Basics - Anfänger-Themen 2
H Falsche Ausgabe Java Basics - Anfänger-Themen 2
K falsche Eingabe abfangen Java Basics - Anfänger-Themen 8
L Falsche Methode wird geladen Java Basics - Anfänger-Themen 2
T JLabel hat falsche größe Java Basics - Anfänger-Themen 1
H Swing Button hat falsche Größe Java Basics - Anfänger-Themen 5
T Input/Output Falsche Eingabe ausgeben Java Basics - Anfänger-Themen 3
R StringBounds falsche Ergebnisse Java Basics - Anfänger-Themen 5
D Falsche Zeile wird in JTable gelöscht Java Basics - Anfänger-Themen 6
W Array in String und String in Array - falsche Ausgaben Java Basics - Anfänger-Themen 20
T Falsche Ausgabe ???? Java Basics - Anfänger-Themen 13
S Falsche Ausgabe Java Basics - Anfänger-Themen 6
M Input/Output ISBN Leser - falsche Eingabe ausgeben Java Basics - Anfänger-Themen 2
V Personenverwaltung mit List<>, falsche Ausgaben Java Basics - Anfänger-Themen 5
R Methoden Switch wählt das Falsche Java Basics - Anfänger-Themen 17
K Falsche Methode Java Basics - Anfänger-Themen 3
M Falsche Eingabe wiederholen lassen Java Basics - Anfänger-Themen 2
W Methoden Falsche Felder von Methode belgegt Java Basics - Anfänger-Themen 14
M falsche implementierung von currentTimeMillis() ? Java Basics - Anfänger-Themen 14
F charAt-Methode liefert falsche Unicode-Werte Java Basics - Anfänger-Themen 8
P Falsche Werte bei Zeitmessungen Java Basics - Anfänger-Themen 7
Helgon Falsche Zeichen im Text Java Basics - Anfänger-Themen 10
S Parameterübergabe - identische Funktionen, aber falsche Funktion Java Basics - Anfänger-Themen 5
G Bubblesort - Falsche Sortierung Java Basics - Anfänger-Themen 6
D Kriege falsche MD5 Java Basics - Anfänger-Themen 12
R run ->eclipse ruft falsche Programme auf Java Basics - Anfänger-Themen 5
D p q formel gibt zum Teil falsche Werte aus Java Basics - Anfänger-Themen 5
S Falsche Version? Java Basics - Anfänger-Themen 2
C Falsche Zeit Java Basics - Anfänger-Themen 2
V Falsche Augabe Java Basics - Anfänger-Themen 16
C Klammern einlesen!!! Falsche Ausgabe!!!! Java Basics - Anfänger-Themen 4
S Falsche Reihenfolge von Methodenaufrufen Java Basics - Anfänger-Themen 8
H Falsche Eingabe über try-catch abfangen Java Basics - Anfänger-Themen 2
K Verschiebeoperatoren - manchmal falsche Ergebnisse Java Basics - Anfänger-Themen 7
L Datenbankanbindung ODBC falsche pfadangabe? Java Basics - Anfänger-Themen 3
O Falsche Bed. (ein überlauf) seh den Fehler aber nicht. Java Basics - Anfänger-Themen 3
G static array liefert falsche Werte zurück Java Basics - Anfänger-Themen 2
S Falsche Ausgabe Java Basics - Anfänger-Themen 3
L Wegen TableSorter wird falsche Zeile einer Tabelle gelöscht? Java Basics - Anfänger-Themen 2
G falsche Version Java Basics - Anfänger-Themen 3
L Falsche Umsetzung von MVC, brauche Hilfe Java Basics - Anfänger-Themen 6
D Tabelle -> Daten eingeben -> Falsche erhalten Java Basics - Anfänger-Themen 9
S Falsche Ausgabe? Java Basics - Anfänger-Themen 2
F Falsche Daten aus Datei Java Basics - Anfänger-Themen 2
G Falsche Java befehle, doch was ist falsch? Java Basics - Anfänger-Themen 9
C falsche Eingabe abfangen Java Basics - Anfänger-Themen 8
M Falsche do-Schleife? Java Basics - Anfänger-Themen 4
E falsche Ausgabe Java Basics - Anfänger-Themen 7
D Falsche Datumsausgabe? Java Basics - Anfänger-Themen 5
J erhalte falsche Kalenderwoche - wo ist der Fehler? Java Basics - Anfänger-Themen 2
C Darstellung von Datum - Codes richtig? Java Basics - Anfänger-Themen 2
pkelod Binäre Darstellung Bitwise-Operator Java Basics - Anfänger-Themen 10
W OOP Objektorientiert: Darstellung von Uhrzeiten im 24-Stunden-Format Java Basics - Anfänger-Themen 15
J Frage zur Darstellung Java Basics - Anfänger-Themen 2
I Darstellung von Brüchen Java Basics - Anfänger-Themen 25
T Erste Schritte Darstellung der Java-Projekte in Eclipse Java Basics - Anfänger-Themen 2
H Eclipse , Design-Modus, unvollständige Darstellung Java Basics - Anfänger-Themen 0
I Fehlermeldung bei Darstellung von Arrays Java Basics - Anfänger-Themen 2
G Graphische Darstellung (Arbeiten mit einem Window) Java Basics - Anfänger-Themen 1
V Rechenzeichen bei Termen - Darstellung bei Schleifen Java Basics - Anfänger-Themen 7
M Arrays: Trennung von Daten und Darstellung Java Basics - Anfänger-Themen 1
B Quadratwurzel nach Heron in rekursiver Darstellung Java Basics - Anfänger-Themen 1
M Darstellung von Dezimalzahlen Java Basics - Anfänger-Themen 2
S Darstellung eines Balkendiagrammes Java Basics - Anfänger-Themen 14
G Adjazenzlisten-Darstellung Java Basics - Anfänger-Themen 2
J Automatentheorie-Darstellung der regulären Sprache eines DEA Java Basics - Anfänger-Themen 5
A Char Bytes Umwandlung und Darstellung Java Basics - Anfänger-Themen 3
Fab1 Interface UML Darstellung von impl. Methoden Java Basics - Anfänger-Themen 7
K Problem mit JTable Daten-darstellung Java Basics - Anfänger-Themen 6
-horn- Einfache graphische Darstellung von 3D Koordinaten für Flugbahnen? Java Basics - Anfänger-Themen 4
Z Probleme bei Darstellung von Brüchen Java Basics - Anfänger-Themen 15
D Bit-Darstellung Gleitkommazahl Java Basics - Anfänger-Themen 2
E JLabel deaktivieren ohne Veränderung der Darstellung Java Basics - Anfänger-Themen 2
F Tabellenähnliche Darstellung Java Basics - Anfänger-Themen 17
F Datentypen 4- bit darstellung Java Basics - Anfänger-Themen 5
DStrohma Alternative Darstellung von Paketen in Eclipse Java Basics - Anfänger-Themen 2
H Darstellung ComboBox in jTable Java Basics - Anfänger-Themen 5
B Effektive Implementierung für Darstellung großer Datenmengen in Jogl Java Basics - Anfänger-Themen 5
E Darstellung der Choice Einträge Java Basics - Anfänger-Themen 4
W Darstellung negativer Zahlen und Mengen von Zahlen Java Basics - Anfänger-Themen 9
A Program zur Darstellung von Zahlen in Java Java Basics - Anfänger-Themen 4
S Darstellung der Ausgabe Java Basics - Anfänger-Themen 8
A GregorianCalendar -Darstellung mit drawString Java Basics - Anfänger-Themen 3
D Darstellung in Swing Java Basics - Anfänger-Themen 6
A JFileChooser Darstellung Java Basics - Anfänger-Themen 3
K Silo Volumenberechnung mit Visueller darstellung Java Basics - Anfänger-Themen 20
S Darstellung von Umlauten Java Basics - Anfänger-Themen 24
P Problem mit Darstellung im Baum Java Basics - Anfänger-Themen 4
T Special Character darstellung Java Basics - Anfänger-Themen 4
G Problem mit der Darstellung (JFreechart) Java Basics - Anfänger-Themen 3
D JFileChooser Darstellung ändern? Java Basics - Anfänger-Themen 4
B Darstellung eines gesperrten JTextField Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben