Problem beim Subtrahieren eines Double von einem Double

Status
Nicht offen für weitere Antworten.

ajva

Mitglied
Hallo.

Was mache ich falsch wenn ich ein Double des Wertes 3.5 von einem Double des Wertes 3.9 abziehe und statt 0.4 Folgendes erhalte?

3.9 - 3.5 = 0.3999999999999999

Die Doubles habe ich mittels Double.parseDouble() aus einem String gefischt.

Danke schonmal fürs lesen.
 

Marco13

Top Contributor
Im allgemeinen haben Kommazahlen ein beschränkte genauigkeit. Einige Zahlen können nicht exakt dargestellt werden, so ähnlich wie man 1.0/3.0 im Dezimalsystem nicht genau darstellen kann (weil es periodisch ist).

http://docs.sun.com/source/806-3568/ncg_goldberg.html

EDIT: Genaugenommen können fast alle Zahlen nicht genau dargestellt werden. Erschreckend, eigentlich :shock: :wink:
 

ajva

Mitglied
Danke für Deine Antwort Marco13.

Richtig. 0.33333 != 1/3. Das ist mir klar und da wäre ich mit einer Rundung auf ein paar Kommastellen auch zufrieden. Aber in meinem Programm wird grundsätzlich mit nicht mehr als einer Stelle hinter dem Komma gerechet und es wird immer nur eine Differenz berechnet.

Und meines Erachtens kann 3.9 - 3.5 im Dezimalsystem dargestellt werden. Und zwar so: 0.4 ;-)

Ich kann die beiden beteiligten Zahlen mit 10 multiplizieren und das Ergebnis durch 10 teilen. Dann habe ich die 0.4. Aber das muss doch auch ohne diesen "Aufwand" gehen.
 
S

SlaterB

Gast
diese Behauptung ist haltlos, da Computer kein Dezimalsystem verwenden,
und selbst wenn man sich noch die Mühe machen würde, fürs Binärsystem nachzuschauen,
dann reicht auch das nicht,
denn es kann immer noch sein (was der Fall ist), dass die Zahl im double ganz anders gespeichert wird,
da muss 2^1000 reinpassen wie auch 2^-1000,
die paar Bits dieses Datentyps sind ziemlich beansprucht, da musst du verzeichen, dass bestimmte Spezialfälle Probleme machen

ein viel interessanteres Argument ist, dass du andererseits mit
double d = 0.4;
die 0.4 korrekt ohne Rundungsprobleme speichern kannst ;)

warum dass so ist habe ich auch noch nicht ganz verstanden oder vergesse es immer wieder ;)
Details stehen im verlinkten Dokument
 

Marco13

Top Contributor
Wie SlaterB schon gesagt hat, mögen Computer das Dezimalsystem nicht so. Vermutlich, weil sie keine 10 Finger haben, sondern nur einen Stecker, mit dem sie an der Steckdose hängen - oder eben nicht :wink:

Etwas weniger tiefgehend, dafür aber "übersichtlicher" wird die Darstellung von Floating-Point-Zahlen z.B. hier beschrieben: http://en.wikipedia.org/wiki/IEEE_floating-point_standard

@SlaterB: Der Grund dafür, dass der Fehler bei x=3.9-3.5 auftritt, aber NICHT bei x=0.4 (und auch NICHT bei x=0.9-0.5 :!: ) ist, wenn ich mich nicht irre, das was als "Cancellation" bezeichnet wird. GANZ grob: Die Zahlen, die voneinander abgezogen werden, sind so groß, und die Differenz so klein, dass für die Darstellung der Differenz "andere" Bits benötigt würden, als für ihre Berechnung. (Wirklich, SEHR grob :roll: )

Besonders deutlich sieht man das, wenn man sich mal die Bits anguckt:
Code:
class DoubleTest3
{
    public static void main(String args[])
    {
        double a = 0.4; // Das gewünschte Ergebnis
        double b = 1.9 - 1.5; // Der Exponent dieser beiden Zahlen ist größer als der Exponent des gewünschten Ergebnisses
        double c = 0.9 - 0.5; // Der Exponent dieser beiden Zahlen ist der gleiche wie der Exponent des gewünschten Ergebnisses
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);

        System.out.println(Long.toBinaryString(Double.doubleToLongBits(a)));
        System.out.println(Long.toBinaryString(Double.doubleToLongBits(b)));
        System.out.println(Long.toBinaryString(Double.doubleToLongBits(c)));

    }
}
Ausgabe:
Code:
0.4
0.3999999999999999
0.4
11111111011001100110011001100110011001100110011001100110011010
11111111011001100110011001100110011001100110011001100110011000 <- Da ist ein Bit verloren gegangen
11111111011001100110011001100110011001100110011001100110011010


EDIT: Damit das nicht falsch rüberkommt: Die Zahl "0.4" ist - wenn ich mich nicht täusche - NICHT genau darstellbar. Dass sie im ersten und dritten Fall "genau" asgegeben wird, ist vielmehr eine "Nettigkeit" der Methode, die eine double-Zahl wie 0.4 in einen String umwandelt, der dann ausgegeben werden kann!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Problem beim Rendern von 3D-Objekt Android & Cross-Platform Mobile Apps 0
DaniSahne96 Problem beim Appdebuggen auf Smartphone Android & Cross-Platform Mobile Apps 3
P Android Problem beim Widget - Denkfehler ? Android & Cross-Platform Mobile Apps 2
V [Java] und [JavaME] ClientServer StreamConnection . Problem beim lesen / schreiben Android & Cross-Platform Mobile Apps 2
R Ein Problem beim ausführen von folgendem Quelltext Android & Cross-Platform Mobile Apps 11
F Problem beim Erstellen der Jar File Android & Cross-Platform Mobile Apps 4
W Prüfen, ob App auf Gerät installiert ist Problem S10 Android & Cross-Platform Mobile Apps 11
W In App Purchase Problem? Android & Cross-Platform Mobile Apps 36
W Problem mit Android Studio Android & Cross-Platform Mobile Apps 0
T Android R.string.test+i Problem Android & Cross-Platform Mobile Apps 2
K Android to Pi | Websocket Problem Android & Cross-Platform Mobile Apps 3
N Intent und finish() Problem Android & Cross-Platform Mobile Apps 5
B Android App Programmierung Einsteiger Problem Android & Cross-Platform Mobile Apps 4
emeraldo Android Problem mit Bottomnavmenu Android & Cross-Platform Mobile Apps 10
I Das Problem mit der Tastatur... android:windowSoftInputMode="adjustPan" Android & Cross-Platform Mobile Apps 1
M Android App → Problem mit dem Speichern von einem Bitmap–Objekt. Android & Cross-Platform Mobile Apps 1
A Android Android Studio Emulator Problem Android & Cross-Platform Mobile Apps 1
S Android Studio Bluetooth App Problem Android & Cross-Platform Mobile Apps 6
J TicTacToe Problem bei kontrolle Android & Cross-Platform Mobile Apps 7
J Button array ID Problem Android & Cross-Platform Mobile Apps 2
M Problem bei Werteübergabe, MSQL verbindung Android & Cross-Platform Mobile Apps 3
S Android Problem mit Android Virtual Device erstellung. Android & Cross-Platform Mobile Apps 2
Anfänger2011 Text to Speech Problem Android & Cross-Platform Mobile Apps 1
S Android Android java onclick listener Problem Android & Cross-Platform Mobile Apps 9
A Android Problem mit ListView und OnItemClickListener.. Android & Cross-Platform Mobile Apps 10
K Problem mit arraylist und button Android & Cross-Platform Mobile Apps 16
R W-Lan Problem über Sockets Android & Cross-Platform Mobile Apps 1
P ViewPager Problem Android & Cross-Platform Mobile Apps 1
A Android Problem mit Video von Youtube abspielen Android & Cross-Platform Mobile Apps 4
A Android Problem mit Zurücktaste und ausgabe der Aktuellen Seite Android & Cross-Platform Mobile Apps 6
B Android Problem mit Soundwiedergabe Android & Cross-Platform Mobile Apps 2
T Android Android Sensor: Java Problem Android & Cross-Platform Mobile Apps 1
L Android Gyroscope Sensor Problem Android & Cross-Platform Mobile Apps 2
S Android GPS Problem Android & Cross-Platform Mobile Apps 24
J Eclipse Emulator Problem Android & Cross-Platform Mobile Apps 1
J Eclipse Emulator Problem Android & Cross-Platform Mobile Apps 0
B Android Problem mit Rückgabewert Android & Cross-Platform Mobile Apps 13
L Android komisches Bitmap-Größe-Problem Android & Cross-Platform Mobile Apps 8
D Android Layout Problem Android & Cross-Platform Mobile Apps 2
R Problem mit View in ScrollView Android & Cross-Platform Mobile Apps 6
R Eclipse + AndroidSDK - Problem mit Referenzen Android & Cross-Platform Mobile Apps 6
M Problem mit setOnClickListener Android & Cross-Platform Mobile Apps 4
M GCM IntentService Problem Android & Cross-Platform Mobile Apps 3
D Android Gallery Problem Android & Cross-Platform Mobile Apps 5
P Problem mit Cell id Android & Cross-Platform Mobile Apps 6
L Android Problem mit "spinner" Android & Cross-Platform Mobile Apps 10
D Android problem mit geschwindigkeitsberechnung app Android & Cross-Platform Mobile Apps 2
E Android Problem mit Contact Provider Android & Cross-Platform Mobile Apps 1
H Android Problem mit ListActivity Android & Cross-Platform Mobile Apps 3
S Android Layout Problem mit fill_parent Android & Cross-Platform Mobile Apps 5
F Android ExpandableList, SimpleCursorTreeAdapter, Cursor Problem Android & Cross-Platform Mobile Apps 2
A Android Problem mit Long.getLong() bzw. Integer.getInteger() Android & Cross-Platform Mobile Apps 2
A Problem mit HTTP- Verbindung Android & Cross-Platform Mobile Apps 4
F Eclipse JAD File erzeugen -- Problem Android & Cross-Platform Mobile Apps 10
M Problem mit dem Auslesen von System Properties Android & Cross-Platform Mobile Apps 7
P wtk problem Android & Cross-Platform Mobile Apps 3
G Math exp() Problem Android & Cross-Platform Mobile Apps 4
G S40 Problem Android & Cross-Platform Mobile Apps 8
C Problem Device/Emulator wird nicht erkannt Android & Cross-Platform Mobile Apps 3
S Image Problem Android & Cross-Platform Mobile Apps 11
M Problem mit den Softkeys Android & Cross-Platform Mobile Apps 4
G J2ME jar-problem Android & Cross-Platform Mobile Apps 10
S Komisches Problem Android & Cross-Platform Mobile Apps 3
A Problem: Canvas-Grösse Motorola RAZR v3r Android & Cross-Platform Mobile Apps 8
S Problem mit Einbindung einer externer Bibliothek Android & Cross-Platform Mobile Apps 2
G Random - Problem Android & Cross-Platform Mobile Apps 5
E problem mit den resourcen Android & Cross-Platform Mobile Apps 2
O Problem mit Datagramconnection Android & Cross-Platform Mobile Apps 2
P Problem mit der Uhrzeit Android & Cross-Platform Mobile Apps 2
S Problem auf dem Handy Android & Cross-Platform Mobile Apps 3
R Android Löschfunktion beim Wischen Android & Cross-Platform Mobile Apps 10
W Rand ändern beim ImageView bei Picasso Android & Cross-Platform Mobile Apps 1
Arif Android Android Studio: Fehler beim Einbinden fremder Bibliothek? Android & Cross-Platform Mobile Apps 2
L App stürtzt ab beim öffnen Android & Cross-Platform Mobile Apps 1
JavaWolf165 Android Fehler beim Speichern/Downloaden einer Datei Android & Cross-Platform Mobile Apps 2
S Android Probleme beim Verbinden mit einer HTTPS Seite Android & Cross-Platform Mobile Apps 4
M Android Fehler beim Parsen. Android & Cross-Platform Mobile Apps 29
V Android Fehlermeldung beim Öffnen von Eclipse nach Installation der Android Erweiterung Android & Cross-Platform Mobile Apps 4
M Error beim drücken der Zurück-Taste am Handy Android & Cross-Platform Mobile Apps 2
S Fehler beim Textdatei einlesen!? Android & Cross-Platform Mobile Apps 7
A Fehlermeldung beim ändern der ViewGroup. Android & Cross-Platform Mobile Apps 6
H Buttons färben sich mit, beim Hintergrund ändern Android & Cross-Platform Mobile Apps 3
A Mehrere Fehler beim Compilieren Android & Cross-Platform Mobile Apps 4
L Android OutOfMemory beim erneuten Starten der App Android & Cross-Platform Mobile Apps 2
N Android Retain Dialog verschwindet beim drehen Android & Cross-Platform Mobile Apps 4
B Android GameLoopThread stürzt beim 2ten start der App ab? Android & Cross-Platform Mobile Apps 4
K Nullpointer beim Löschen von Datenbankeintrag, je nachdem wo der Befehl steht Android & Cross-Platform Mobile Apps 5
S Java ME Exception beim Abspielen von Musik Android & Cross-Platform Mobile Apps 6
G Fehler beim Import "Invalid project description" Android & Cross-Platform Mobile Apps 2
G unterschiedliches Verhalten beim Installieren des App auf dem Smartphone Android & Cross-Platform Mobile Apps 3
K Android schwarzer Bildschirm beim Rendern von Text und Dreiecken Android & Cross-Platform Mobile Apps 9
A Fehler beim Starten eines Intents - alles in einer Klasse funktioniert... Android & Cross-Platform Mobile Apps 4
J Android Verhalten beim Hinzufügen neuer Views? Android & Cross-Platform Mobile Apps 6
S Android Fehler beim Anzeigen meines Apps auf Galaxy Tab Android & Cross-Platform Mobile Apps 4
G Beziehung von THIS beim Imageadapter und AsyncTask Android & Cross-Platform Mobile Apps 7
N Error in HTTP operation beim KXML parsen Android & Cross-Platform Mobile Apps 7
G fehldermeldung beim klicken auf "build" Android & Cross-Platform Mobile Apps 8
L SecurityException beim lesen/schreiben eine Datei Android & Cross-Platform Mobile Apps 7
S createPlayer beim Entwickeln Android & Cross-Platform Mobile Apps 6
T TimePicker Zeiten subtrahieren. Android & Cross-Platform Mobile Apps 4

Ähnliche Java Themen

Neue Themen


Oben