Umwandlung

Status
Nicht offen für weitere Antworten.
G

gast

Gast
Ich hab grad gemerkt, dass ein Programm von mir mit falschen Werten rechnet und wollte der Sache auf den Grund gehen.
Es soll Eurobeträge aus einer Datei auslesen, das in Cents umwandeln und damit weiter rechnen.
Die Zeile zum einlesen lautet:
Code:
i[c]=(int)(100.0*(Float.parseFloat(f.readLine().replace(',', '.'))));

So, ein wenig modifiziert, um erkennen können, was er tut:
Code:
String zeile=f.readLine();
System.out.println(zeile);
System.out.println(zeile.replace(',', '.'));
System.out.println((Float.parseFloat(zeile.replace(',', '.'))));
System.out.println(100.0*(Float.parseFloat(zeile.replace(',', '.'))));
System.out.println((int)(100.0*(Float.parseFloat(zeile.replace(',', '.')))));
i[c]=(int)(100.0*(Float.parseFloat(zeile.replace(',', '.'))));

der Output sieht dann z.B. so aus:

  • 6.64
    6.64
    6.64
    663.9999866485596
    663

Was zur Hölle soll die 4. Zeile?!
Und wie krieg ich da richtige Werte raus?

Ach ja, hier noch ein KSKB:
Code:
public class KSKB
{
	public static void main(String[] args)
	{
		String zeile="6.64";
		System.out.println(zeile);
		System.out.println(zeile.replace(',', '.'));
		System.out.println((Float.parseFloat(zeile.replace(',', '.'))));
		System.out.println(100.0*(Float.parseFloat(zeile.replace(',', '.'))));
		System.out.println((int)(100.0*(Float.parseFloat(zeile.replace(',', '.')))));
		int i=(int)(100.0*(Float.parseFloat(zeile.replace(',', '.'))));
	}
}
 
S

SlaterB

Gast
bei float (und double) wird mit minimalen Verlust gerechnet,
die Darstellung per Bits und Bytes kann das Dezimalsystem in vertretbaren Speicheraufwand nicht ideal abbilden

verwende Math.round() vor dem Kappen der Nachkommastellen per (int),
dann gehts
 
G

gast

Gast
ja aber....
was gibts dann da viel an Aufwand und Genauigkeit?
das sind zwei Nachkommastellen, die sowieso wegmultipliziert werden sollen...
 
S

SlaterB

Gast
ein float ist eine Zahl 1,abcde.. *2^x


6.64 = 1.66 * 4
100 = 1.5625 * 64
664 = 1.296875 * 512

die kürzeste Zahl 6.64 ist hier gar die schlimmste, 0.66 ist als Binärzahl nicht in 25 Bits darzustellen, vielleicht überhaupt nicht in endlich vielen Bits,
siehe

http://www.h-schmidt.net/FloatApplet/IEEE754de.html
(6.64 eintippen)
 

Lennart

Mitglied
Es wurde schon in einem anderen Thread geschrieben, dass Gleitkommazahlen ungeeignet für Geldbeträge sind.
Leider gibt es auch Lehrbuchautoren, die das Gegenteil suggerieren.

Was zur Hölle soll die 4. Zeile?!

Eben. Man kommt in Teufels Küche.

Grüße
Lennart
 

Leroy42

Top Contributor
Lennart hat gesagt.:
Leider gibt es auch Lehrbuchautoren, die das Gegenteil suggerieren.

Also ich bin zwar kein Lehrbuchautor, benutze aber seit
zwei Jahren (für gewerbliche eBay-Verkäufe) einfach --
weil ich nun mal grundsätzlich faul bin :lol: --
ausschließlich doubles für Geldberechnungen, auch
in Verbindung mit einer MySQL-Datenbank auf dem
Server, mit dem sich mein Programm verbindet.

Ich habe noch nie Probleme gehabt, double's Genauigkeit
reicht für normale Geldberechnungen vollkommen aus;
zusätzlich die Ausgaben vernünftig formatieren (System.out.printf
und Konsorten) natürlich vorausgesetzt.

Aber ich lasse mich gerne eines Besseren belehren; wobei
zum Beispiel, kann es Probleme geben?
 

Lennart

Mitglied
Hallo Leroy42!

Unter bestimmten Umständen kann die Verwendung von Gleitkommatypen funktionieren.

Probleme können auftreten:
- wenn Du mit hohen Geldbeträgen rechnest,
- wenn Du eine sehr große Anzahl von Einzelpositionen addierst,
- bei Vergleichen

Vielleicht fällt jemandem noch etwas anderes ein. Bin leider kein Mathematiker.

Aber es passt einfach nicht zusammen: Gleitkommazahl ist ungenau - Geldbetrag muss genau sein.

Empfehlung in Java: BigDecimal, eventuell Long-Integer
In Datenbanksystemen: DECIMAL

Siehe auch Geld in Java

Grüße
Lennart
 

Lennart

Mitglied
Nachtrag noch

Man kommt in Teufels Küche.

Damit habe ich folgendes gemeint:
Angenommen man hat eine Abrechnungslösung für ein Unternehmen geschrieben, bei dem in kurzer Zeit viele Datensätze anfallen.

Nach ein paar Wochen im Produktiveinsatz fallen Rechenfehler auf. Diese Situation kann sehr unangenehm sein.

Beste Grüße
Lennart
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
Jose05 Nullpointerexception bei Umwandlung von String zu int Java Basics - Anfänger-Themen 2
J Umwandlung String zu ASCII-Wert und anders Java Basics - Anfänger-Themen 17
M Operatoren Umwandlung div. Operatoren Java Basics - Anfänger-Themen 7
B Date - Umwandlung OffsetDateTime Java Basics - Anfänger-Themen 11
J Probleme bei der Umwandlung einer Farbe von Hex zu RGB Java Basics - Anfänger-Themen 8
J Umwandlung for-Schleife Java Basics - Anfänger-Themen 10
R Fehler bei ASCII Char zu Int Umwandlung Java Basics - Anfänger-Themen 2
M Umwandlung von StringArray in String Java Basics - Anfänger-Themen 2
P Umwandlung in Javacode Java Basics - Anfänger-Themen 10
M Umwandlung String zu int Java Basics - Anfänger-Themen 2
M Umwandlung von Array zu ArrayList Java Basics - Anfänger-Themen 7
S Umwandlung Binär in Dezimal (ohne array etc.) Java Basics - Anfänger-Themen 6
L Interface JOptionPane Umwandlung Java Basics - Anfänger-Themen 10
A Char Bytes Umwandlung und Darstellung Java Basics - Anfänger-Themen 3
K Datentypen Umwandlung einer Textfeldeingabe in einen binären Wert Java Basics - Anfänger-Themen 2
G Umwandlung in verschiedene Zahlensysteme Java Basics - Anfänger-Themen 4
L Umwandlung von String to Int funktioniert nciht Java Basics - Anfänger-Themen 3
V Methoden Umwandlung in generische Methode Java Basics - Anfänger-Themen 8
J Datentypen Umwandlung von Arraylist in ein StringArray Java Basics - Anfänger-Themen 10
J Datentypen Umwandlung von Kommazahl in Punktzahl Locale DE auf US Java Basics - Anfänger-Themen 5
A Umwandlung einer Datei ins int Java Basics - Anfänger-Themen 26
A Umwandlung gcj -> java Java Basics - Anfänger-Themen 4
F Umwandlung vom Dezimalsystem Java Basics - Anfänger-Themen 7
M Umwandlung von Array in Vector und umgekehrt Java Basics - Anfänger-Themen 6
N Umwandlung String - double für mehrdimensionalen array Java Basics - Anfänger-Themen 2
L Umwandlung int <--> byte Java Basics - Anfänger-Themen 2
S Umwandlung von Integer zu String Java Basics - Anfänger-Themen 4
F Datentypen Umwandlung int in String Java Basics - Anfänger-Themen 6
Screen Kurze Frage Umwandlung von Zahlen Java Basics - Anfänger-Themen 2
A Umwandlung int[][][] in String Java Basics - Anfänger-Themen 7
A umwandlung biginteger in int[] Java Basics - Anfänger-Themen 9
A einlesen, schreiben, umwandlung datentyp Java Basics - Anfänger-Themen 10
J Wrapperklasse und ihre Umwandlung Java Basics - Anfänger-Themen 2
Screen Erklärung von der Umwandlung von .class in .jar o. .exe ! Java Basics - Anfänger-Themen 5
Semox Umwandlung von Sonderzeichen in HTML-Datei mit Ausgabe Java Basics - Anfänger-Themen 7
B Umwandlung gemäß Package-Anweisung Java Basics - Anfänger-Themen 5
$ Umwandlung von Schleifen in andere Java Basics - Anfänger-Themen 4
S Problem bei Umwandlung ins Hexadezimalsystem Java Basics - Anfänger-Themen 2
D Umwandlung char -> dezimalzahl und ausgabe als int Java Basics - Anfänger-Themen 5
A String to Char Umwandlung. Java Basics - Anfänger-Themen 7
R "Umwandlung" SQL-Result in Objekt Java Basics - Anfänger-Themen 5
H Umwandlung von Zahlensystemen Java Basics - Anfänger-Themen 7
E Umwandlung von std, min und sek Java Basics - Anfänger-Themen 2
G Probleme mit Colour und Color, umwandlung möglich? Java Basics - Anfänger-Themen 5
J Umwandlung von Integer in Char Java Basics - Anfänger-Themen 8
Z Problem bei sql-date-Umwandlung Java Basics - Anfänger-Themen 2
T String als Array und Umwandlung in Char Java Basics - Anfänger-Themen 7
R Umwandlung Java Basics - Anfänger-Themen 35
G Frage zu Umwandlung char[] in string[] bzw. Schleifen Java Basics - Anfänger-Themen 9
S Umwandlung eines Character-Streams in ein Image Java Basics - Anfänger-Themen 17
N x.toString(x); umwandlung von long in String Java Basics - Anfänger-Themen 3
F Umwandlung von String in Integer Java Basics - Anfänger-Themen 3
S Umwandlung von int in String Java Basics - Anfänger-Themen 3
J Warum funktioniert meine Umwandlung nicht? Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben