Normale Rechnung - komisches Ergebnis.

Mujahiddin

Top Contributor
Folgender Code ist gegeben:
Java:
System.out.println(geld + " + (" + (double)verkaufteBecher + " * (" + (double)verkaufspreis/100 + " - " + Daten.SAFTBECHER_PREIS + "))");
geld = geld + ((double)verkaufteBecher*1.0 * ((double)(verkaufspreis/100) - Daten.SAFTBECHER_PREIS));
System.out.println(geld);
Wichtig ist natürlich die mittlere Zeile, in der der Gewinn vom heutigen Tag zusammengezählt und dem eigenen Geld zugefügt wird. Nur leider kommt ein total unsinniges Ergebnis raus.
Wenn ich das in meinen Taschenrechner eingebe, kommt 117.6 raus.
Ich dachte zuerst, es könnte an Double-Integer Mischmasch liegen, hab alles in doubles umgewandelt und trotzdem das gleiche Problem.
Die Konsole spuckt folgendes aus:

5.6 + (140.0 * (1.4 - 0.6000000000000001))
61.59999999999999

Ich bin am Ende mit meinem Latein!

Liebe Grüße,
Mujahiddin!
 

XHelp

Top Contributor
Bei verkaufspreis/100 kommt nicht 1.4, sondern ein int wert (da du durch 100 und nicht durch 100.0 teilst), also 1
Dementsprechend lautet die Formel:
5.6 + (140.0 * (1.0 - 0.6000000000000001))

Teile also durch 100.0 und es müsste passen.
 
G

Gast2

Gast
Java:
(double)verkaufspreis/100
Hier castet er zuerst den Verkaufspreis auf double => es kommt 1.4 raus.

Java:
(double)(verkaufspreis/100)
Da du hier geklammert hast rechnet java zuerst verkaufspreis / 100 => da kommt 1 raus, danach der cast auf double ergibt dann 1.0
 

XHelp

Top Contributor
Ich nur eine Vermutung, aber:
in Sysout machst du
Code:
(double)verkaufspreis/100
und in der Formel
Code:
((double)(verkaufspreis/100))
Durch die Klammer bestimmst du ja was gecastet wird.
 

Mujahiddin

Top Contributor
Ja, okay, stimmt.
Dann meine letzte Frage:
Wie ihr seht, ist bei Daten.SAFTBECHER_PREIS 0.6000000001. das 0000001 hinten ergibt 0 sinn, da sich der preis folgendermaßen zusammensetzt:

public static final double KONZENTRAT_PREIS = 11.00;
public static final double SUESSSTOFF_PREIS = 1.50;
public static final double BECHER_PREIS = 0.02;
public static final double KONZENTRAT_PRO_BECHER = 0.05;
public static final double SUESSSTOFF_PRO_BECHER = 0.02;
public static final double SAFTBECHER_PREIS = KONZENTRAT_PREIS * KONZENTRAT_PRO_BECHER + SUESSSTOFF_PREIS * SUESSSTOFF_PRO_BECHER + BECHER_PREIS;

also sprich 0.55 + 0.03 + 0.02.
es müsste zwar 0.60 rauskommen, wieso kommt aber 0.6000001 raus? Das ist bei doubles häufiger so. Wie kann man das vehrindern? (wenn mans nicht verhindern kann -> geht es irgendwie, dass ich es auf 2 dezimalstellen runde? also 0.60?)
 
Zuletzt bearbeitet:
G

gman

Gast
wieso kommt aber 0.6000001 raus? Das ist bei doubles häufiger so

Bei solchen Rechensachen empfiehlt es sich "BigDecimal" statt "double" zu verwenden. Da kannst du
dann auch bequem runden "setScale" und auch angeben wie gerundet werden soll "RoundingMode".
 

Mujahiddin

Top Contributor
Okay, hört sich schon mal nicht schlecht an... Aber ich kann keine Mal-Zeichen dazwischen setzen, oder mach ich was falsch?
Java:
public static final BigDecimal KONZENTRAT_PREIS = new BigDecimal(11.00);
public static final BigDecimal SUESSSTOFF_PREIS = new BigDecimal(1.50);
public static final BigDecimal BECHER_PREIS = new BigDecimal(0.02);
public static final BigDecimal KONZENTRAT_PRO_BECHER = new BigDecimal(0.05);
public static final BigDecimal SUESSSTOFF_PRO_BECHER = new BigDecimal(0.02);
public static final BigDecimal SAFTBECHER_PREIS = KONZENTRAT_PREIS * KONZENTRAT_PRO_BECHER + SUESSSTOFF_PREIS * SUESSSTOFF_PRO_BECHER + BECHER_PREIS;
- Der Operator * ist für den/die Argumententyp(en) java.math.BigDecimal, java.math.BigDecimal nicht definiert.
 

Mujahiddin

Top Contributor
okay, und warum muss man alles, was mit double zu tun hat, in BigDecimal umrechnen, nur weil paar Java Programmierer so schlau waren, in irgendwelche normale Rechnungen völlig sinnlose Abweichungen reinzubauen?
Tut mir Leid, ich weiß, bisschen überreagiert, aber das nervt irgendwie - ich muss jetzt also das ganze Programm umschreiben, nur damit ich hinten kein 00001 stehen hab?
 

hemeroc

Bekanntes Mitglied
Der Grund warum das passiert liegt in der Natur der Binärdarstellung, genauer nachzulesen hier Gleitkommazahl ? Wikipedia.

Und natürlich lässt sich das Problem umgehen, beispielsweise mittels runden:
Java:
double precision = Math.pow(10, anzahlDerGewünschtenNachkommastellen);
deineGleitkommaZahl = Math.round(deineGleitkommaZahl * precision) / precision;

LG Hemeroc
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Enum oder normale Klasse? Java Basics - Anfänger-Themen 10
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
A eine neue normale String-Array von einer String-Array, die in for schleife ist, schaffen Java Basics - Anfänger-Themen 3
3 ArrayList Integer Wrapper Klasse als Ersatz für normale Arrays Java Basics - Anfänger-Themen 10
C Java und "normale" Befehle Java Basics - Anfänger-Themen 3
C Rekursion überführen in eine normale methode Java Basics - Anfänger-Themen 1
Rayo Eingelesene Ascii Zahlen wie normale Zahlen prüfen Java Basics - Anfänger-Themen 4
Helgon Unterschied runnable und normale jar Java Basics - Anfänger-Themen 6
S Multi Threaded Version langsamer als normale Version Java Basics - Anfänger-Themen 41
K Wie kann ich aus jar Dateien wieder normale Klassen generieren? Java Basics - Anfänger-Themen 7
Developer_X Kreiskoordinaten in Normale Koordinaten umrechnen Java Basics - Anfänger-Themen 4
M Erste Schritte PDF to elektr. Rechnung Java Basics - Anfänger-Themen 11
I Review von euch erwünscht, double Rechnung falsch Java Basics - Anfänger-Themen 34
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
L Geteilt Rechnung mit Nachkomma? Java Basics - Anfänger-Themen 4
S Uhrzeit Rechnung Java Basics - Anfänger-Themen 8
3 Taschrechner Rechnung durchführen Java Basics - Anfänger-Themen 8
K Rechnung in Java Java Basics - Anfänger-Themen 6
S Wie Typecaste ich nur das Ergebniss einer Rechnung ? Java Basics - Anfänger-Themen 7
B Rechnung ohne Klammer liefert komisches Ergebniss Java Basics - Anfänger-Themen 3
S Simple Rechnung ist fehlerhaft! Java Basics - Anfänger-Themen 13
M Vektor Rechnung Java Basics - Anfänger-Themen 6
V Erste Schritte Einfache Rechnung mit Exponenten Java Basics - Anfänger-Themen 3
R Erste Schritte Taschenrechner - Punkt-vor-Strich Rechnung Java Basics - Anfänger-Themen 1
S Variablen Rechenzeichen als Variablen in Rechnung einbinden Java Basics - Anfänger-Themen 4
L Erste Schritte Programm Bestellung/Rechnung addieren Java Basics - Anfänger-Themen 3
M Erste Schritte Nachkommastellen falsch bei Rechnung Java Basics - Anfänger-Themen 3
E Problem mit modulo Rechnung Java Basics - Anfänger-Themen 8
L Rechnung Java Basics - Anfänger-Themen 13
C String Rechnung in Int Java Basics - Anfänger-Themen 8
D Mathematische Rechnung als String Java Basics - Anfänger-Themen 4
K "Simple" Rechnung in Java Java Basics - Anfänger-Themen 3
M Einfache Rechnung(R=U/I) Java Basics - Anfänger-Themen 12
B Rechnung per Hand anders als von Java Java Basics - Anfänger-Themen 6
F Mal rechnung Java Basics - Anfänger-Themen 2
truesoul Skalierungs-Rechnung Java Basics - Anfänger-Themen 2
B Frage zu einfacher Rechnung Java Basics - Anfänger-Themen 3
K Kombifeld auswählen, rechnung sofort ausführen Java Basics - Anfänger-Themen 11
G Eingebener Wert nach Rechnung wieder original ausgeben. Java Basics - Anfänger-Themen 6
A Sandhaufen Rechnung mit Schubkarre Java Basics - Anfänger-Themen 9
S Einfache Rechnung mit Schleife Java Basics - Anfänger-Themen 10
F Von int zu double bei einfacher Rechnung Java Basics - Anfänger-Themen 2
D Probleme bei einfacher Rechnung Java Basics - Anfänger-Themen 3
D Rechnung Java Basics - Anfänger-Themen 4
R switch erlaubt keine float/double-Rechnung Java Basics - Anfänger-Themen 5
M Komisches Verhalten der Variablen Java Basics - Anfänger-Themen 6
B Thread komisches Verhalten auf Mac ... Java Basics - Anfänger-Themen 6
B Komisches Verhalten von ArrayList Java Basics - Anfänger-Themen 6
K Komisches Verhalten beim erstellen einer Datei Java Basics - Anfänger-Themen 5
D Komisches Verhalten einer For-Schleifen Java Basics - Anfänger-Themen 7
I komisches problem mit GUI Java Basics - Anfänger-Themen 3
G Komisches mit if-Abfrage Java Basics - Anfänger-Themen 2
P Komisches Verhalten von BufferedReader und readLine() Java Basics - Anfänger-Themen 2
megachucky komisches problem mit NoClassDefFoundError Java Basics - Anfänger-Themen 21
A Bruchrechnen.komisches Problem Java Basics - Anfänger-Themen 2
G komisches Ergebnis beim Addieren von doubles Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben