Datentypen Rechnen und Runden

Status
Nicht offen für weitere Antworten.

herrmann

Neues Mitglied
Hallo,
ich habe da mal eine eigentlich banale Frage zu folgendem Code:

Java:
public class Main {


public static void main(String[] args)
{
float fA = 100f;
float fB = 29.99f;
float fC = 19.99f;
float fErg1 = fA * fB;
float fErg2 = fA * fC;
System.out.println("Ergebnis Float: " + fErg1 + " , " + fErg2);


double dA = 100d;
double dB = 29.99d;
double dC = 19.99d;
double dErg1 = dA * dB;
double dErg2 = dA * dC;
System.out.println("Ergebnis Double: " + dErg1 + " , " + dErg2);


}

Ich will eine Kommazahl mal Hundert nehmen.
Bei den Berchnungen kommt bis in Zeile "double dErg2 = dA * dC;" genau
das von mir erwaretete Ergebnis heraus. Doch in dieser Zeile kommt nicht 1999,00 raus, sondern 1998,99999998.

Dieses Verhalten beobachte ich auch bei einigen anderen Zahlen.
Manchmal tritt es bei float auf und manchmal bei double, je nachdem, was für ein Wert * 100 genommen wird.

Warum ist das so, mache ich was falsch? Es kann doch nicht sein,
dass ich für solch eine einfache Rechnung immer einen BigDeciaml oder
mit Math.round() runden muss.

Kann mir das jemand erklären?

Vielen Dank im voraus
 
Zuletzt bearbeitet von einem Moderator:
Zahlen müssen als 101011101001 usw. dargestellt werden, was dezimal gut funktioniert kann binär ganz anders ausschauen,
wenn auch 10^-300 und 10^300 in die knappen 64 Bits passen sollen, muss man da viel tricksen und abkürzen

siehe z.B.
Berechnung Dezimalzahl → IEEE754-Gleitkommazahl
IEEE 754 ? Wikipedia


Details kann ich nicht nennen, alles verstehe ich bisher auch nicht, 1999 + 0.99 wird von Java beispielsweise rundungsfehlerfrei angenommen,
bei 19.99 * 100 kann man vermuten, dass sich der minimale Fehler in der ersten Zahl verhundertfacht und dann bis zur Anzeige durchwirkt,
vielleicht ist das aber auch ganz anders

allgemein gilt aber:
sparsames Binärrechnen enthält Rundungsfehler,
aufwendiges Dezimalrechnen geht fehlerfrei

man kann durchaus kritisieren, dass Java keine einfachere Syntax zur Verfügung stellt,
bei einzelnen Rechnungen ist die Performance ja recht egal

vielleicht reicht es dir, in double zu rechnen, und am Ende für die Ausgabe auf zwei Zahlen nach dem Komma zu runden,
in der Region sollten weniger Rundungsfehler auftreten, falls nicht gerade viele Vorkommastellen vorhanden sind
 
Kleiner Einwurf zur Umrechnung von Binary in Hexadezimal umrechnen kann :

Java:
	String hex = Text1.getText();					
					int i= Integer.parseInt(hex,2);
				    String hexString = Integer.toHexString(i);
				    Text2.setText(hexString);

MfG Nicer
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben