[Java] Gleitkommazahlen vergleichen

ThePsycho

Vice Admiral Special
Mitglied seit
10.03.2003
Beiträge
637
Renomée
1
Hallo,

eine Webrecherche macht mich bei dem Thema nicht so wirklich schlauer:

Wie vergleiche ich bei Java Gleitkommazahlen (elegant)?

Generell gibt es da ja Probleme wegen der internen Darstellung der Zahlen - Gleichheit ist bei (augenscheinlich) gleichen Zahlen nicht gegeben.

Die compareTo()-Methode bei entsprechenden Klassen macht aber z.B. einen Unterschied zwischen -0.0 und +0.0, was auch nicht gerade menschlicher Logik entspricht.

In manchem Beispiel-Code wird dann wiederum sogar der ==-Operator verwendet, was eigentlich immer problematisch sein sollte. (oder?)

Und die saubere Alternative wäre dann noch (Math.abs(a - b) < epsilon) - aber was sind da sinnvolle Werte für epsilon bei float bzw. double?

Hat sich jemand schonmal mit dem Thema beschäftigt (oder mehr gefunden als ich)?
 
alternativ kannst du dir auch BigDecimal (mit compareTo Methode) mit MathContext anschauen:

http://java.sun.com/j2se/1.4.2/docs/api/java/math/BigDecimal.html
http://java.sun.com/j2se/1.5.0/docs/api/java/math/MathContext.html

Rechnen damit ist zwar etwas seltsam (der Grund warum es Operatorüberladung in Java7 geben wird), dafür ist die Zahlengröße allerdings nicht limitiert.

Und die saubere Alternative wäre dann noch (Math.abs(a - b) < epsilon) - aber was sind da sinnvolle Werte für epsilon bei float bzw. double?

geht natürlich auch. Epsilon sollte natürlich in Abhängigkeit zur Zahlengröße liegen, die genaue Größenordnung hängt am Problem ab.
 
alternativ kannst du dir auch BigDecimal (mit compareTo Methode) mit MathContext anschauen:

http://java.sun.com/j2se/1.4.2/docs/api/java/math/BigDecimal.html
http://java.sun.com/j2se/1.5.0/docs/api/java/math/MathContext.html

Rechnen damit ist zwar etwas seltsam (der Grund warum es Operatorüberladung in Java7 geben wird), dafür ist die Zahlengröße allerdings nicht limitiert.



geht natürlich auch. Epsilon sollte natürlich in Abhängigkeit zur Zahlengröße liegen, die genaue Größenordnung hängt am Problem ab.

Gibt es so etwas wie std::numeric_limits bei Java nicht?
 
Zurück
Oben Unten