Datentypen Multiplzieren mit double wird ungenau

BlueCross-

Mitglied
Hallo zusammen,

Ich mache dieses Jahr meine Fachhochschulreife und eines meiner Kernfächer ist Informationstechnik. Die aktuelle aufgabe lautet einen Wechselgeldautomaten zu programmieren.

Java:
import Prog1Tools.IOTools;

public class Verkaufsautomat
{
	public static void main(String[] args)
	{
		double sollbetrag = IOTools.readDouble("Der zu bezahlende Betrag (Euro.Cent): ");


		double istbetrag;
		do
		{

			istbetrag = IOTools.readDouble("Wie viel Geld haben sie?(Euro.Cent): ");


		}while(istbetrag<sollbetrag);

;

		double restgeld = istbetrag - sollbetrag;
		
		restgeld= restgeld * 100;

		System.out.println(restgeld);

		do
		{
		if (restgeld >= 50000)
		{
			restgeld = restgeld -50000;
			System.out.println(restgeld /100);
		}
		}while(restgeld>=50000);

		System.out.println("test 200€");

		do
		{
		if (restgeld >= 20000)
		{
			restgeld = restgeld - 20000;
			System.out.println(restgeld /100);
		}
		}while(restgeld>=20000);

		System.out.println("test test 100€");

		do
		{
		if (restgeld >= 10000)
		{
			restgeld = restgeld - 10000;
			System.out.println(restgeld /100);
		}
		}while(restgeld>=10000);

		System.out.println("test 50 €");

		do
		{
		if (restgeld >= 5000)
		{
			restgeld = restgeld - 5000;
			System.out.println(restgeld /100);
		}
		}while(restgeld>=5000);

		System.out.println("test 20€");

		do
		{
		if (restgeld >= 2000)
		{
			restgeld = restgeld - 2000;
			System.out.println(restgeld /100);
		}
		}while(restgeld>=2000);

		System.out.println("test 10 €");

		do
		{
		if (restgeld >= 1000)
		{
			restgeld = restgeld - 1000;
			System.out.println(restgeld /100);
		}
		}while(restgeld>=1000);

		System.out.println("test 5€");

		do
		{
		if (restgeld >= 500)
		{
			restgeld = restgeld - 500;
			System.out.println(restgeld /100);
		}
		}while(restgeld>=500);

		System.out.println("test 2€");

		do
		{
		if (restgeld >= 200)
		{
			restgeld = restgeld - 200;
			System.out.println(restgeld /100);
		}
		}while(restgeld>=200);

		System.out.println("test 1 €");

		do
		{
		if (restgeld >= 100)
		{
			restgeld = restgeld - 100;
			System.out.println(restgeld /100);
		}
		}while(restgeld!=0);


		System.out.println("test 50cent");

		do
		{
		if (restgeld >= 50)
		{
			restgeld = restgeld - 50;
			System.out.println(restgeld /100);
		}
		}while(restgeld>=50);
		
		System.out.println("test 20 cent €");

		do
		{
		if (restgeld >= 20)
		{
			restgeld = restgeld - 20;
			System.out.println(restgeld /100);
		}
		}while(restgeld>=20);
		
		System.out.println("test 10 cent");

		do
		{
		if (restgeld >= 10)
		{
			restgeld = restgeld - 10;
			System.out.println(restgeld /100);
		}
		}while(restgeld>=10);
		
		System.out.println("test 5cent");

		do
		{
		if (restgeld >= 5)
		{
			restgeld = restgeld - 5;
			System.out.println(restgeld /100);
		}
		}while(restgeld>=5);
		
		System.out.println("test 2cent");

		do
		{
		if (restgeld >= 2)
		{
			restgeld = restgeld - 2;
			System.out.println(restgeld /100);
		}
		}while(restgeld>=2);
		
		System.out.println("test 1 cent");

		do
		{
		if (restgeld >= 1)
		{
			restgeld = restgeld - 1;
			System.out.println(restgeld /100);
		}
		}while(restgeld!=0);

		System.out.println(restgeld);

	}
}

In der Theorie funktionert das einwandfrei, jedoch scheitert es am Schritt :

restgeld = restgeld * 100 ;

Denn hier werden die Werte versudelt. War der Wert davor noch 1.13 so ist der Wert danach 129.999999999999997. ???:L???:L

Wie kann ich das umgehen oder ändern, das dort 130 rauskommt?

Danke im Vorraus 🙂
 
Rechne einfach mit Cent. Dann kannst du alles in Integer rechnen und bekommst keine Rundungsfehler. Du must dann halt lediglich bei der Eingabe und Ausgabe die Zahl neu formatieren.

Gruss

Claus
 
Ok, hab das Problem schlussendlich so gelöst.

Java:
		int x = (int) (istbetrag*100);	
		
		int y = (int) (sollbetrag*100);		
		
		int restgeld = x - y;


Danke für die Tipps 🙂
 
Deine "Lösung" kann in den gleichen Fehler laufen...
Die Multiplikation mit 100 kann ,999999999 ergeben, und der Typecast auf (int) schneidet Kommastellen ab.
Wenn schon, dann
Java:
int restgeld = (int) (Math.Round( (istbetrag - sollbetrag) * 100.0 )); // [cent]
 

Zurück
Oben