Frage von leonardomessi, 42

java ermittlet ein falsches Ergebnis bei bestimmte berechnung von double?

double d7 = (1138/1000.0); double d8 =(0.001*1138); boolean b3 = (d7 == d8)

d7 und d8 sollte das gleiche Ergebnis vermitteln. ist aber nicht der fall, da immer false kommt. warum ist das so?

Antwort
von Computator, 42

Ein Computer kann nicht jede Zahl anzeigen, daher speichert er Zahlen mit Nachkommastelle als Gleitkommazahl und rundet dann. In diesem Beispiel hat der Computer zwei verschiedene Gleitkommazahlen erzeugt. Werden sie gerundet sind sie gleich, aber für den Computer sind es zwei verschiedene Zahlen.

https://de.wikipedia.org/wiki/Gleitkommazahl

Antwort
von Mikkey, 41

Du solltest Dich über die Verwendung von Fließkomma-Zahlen informieren.

Man vergleicht keine doubles, floats oder extendeds auf Gleichheit, weil die zugrundeliegenden Datenfelder keine dichte Repräsentation von R oder Q gewährleisten.

Kommentar von CalvinSchneider ,

Natürlich, float ist ja ein komplexer datentyp, hatte ich ganz vergessen. Der Befehl equal(,) sollte aber funktionieren oder?

Ist meine Antwort ansich aber auch korrekt gewesen?

Kommentar von Mikkey ,

Nach dem was hier steht

http://docs.oracle.com/javase/6/docs/api/java/lang/Double.html#equals(java.lang.Object)

ist das equals() auch nur ein direkter Vergleich der Zahlenrepräsentation. In C# gibt es eine passende Methode, in Java muss man die wohl selbst erstellen (Betrag der Differenz kleiner als eine vorgegebene Genauigkeit).

Natürlich ist Deine Antwort auch zutreffend, ich kann nur nicht sicher sagen, ob int/double tatsächlich int als Ergebnis hat. Ich habe mir von vor Äonen angewöhnt, ints frühzeitig auf double/float zu casten bzw. Konstanten mit ".0" zu verwenden.

Antwort
von CalvinSchneider, 39

Bei der ersten Berechnung ist der Dividend ein Integer darum ist der Quotient ein Integer der dann implizit zu Double konvertiert wird.

Kommentar von CalvinSchneider ,

probier mal bei der ersten berechnung parsedouble(1138) zu verwenden

Kommentar von Mikkey ,

Ist das so? Dann ist das natürlich auch ein Grund.

Keine passende Antwort gefunden?

Fragen Sie die Community