1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Java Floating Point Operations zu ungenau

  • Nikon the Third
  • 26. Oktober 2007 um 01:29
  • Unerledigt
  • Nikon the Third
    3
    Nikon the Third
    Mitglied
    Punkte
    50
    Beiträge
    7
    • 26. Oktober 2007 um 01:29
    • #1
    Code
    double d = 1.5;
        d += 0.7;
        d -= 1.0;

    Hallo.
    Mein Problem liegt genau in den oberen 3 Zeilen Code.
    Führt man sie aus, erwartet man, dass in d anschließend 1.2 gespeichert ist.
    Das ist aber nicht der Fall, sondern: 1.2000000000000002.

    Wie verhindere ich das? bzw wie generiere ich in solchen Fällen die richtigen (erwarteten) Werte (zumindest in der Ausgabe durch String.format(...)) ?

    Danke für eure Hilfe.

    PS: strictfp hilft auch nicht...

  • tonico
    7
    tonico
    Mitglied
    Punkte
    465
    Beiträge
    91
    • 26. Oktober 2007 um 01:56
    • #2

    Das kommt daher, dass Zahlen mit 2er Basis gespeichert werden. In Python bekomm ich das auch:

    >>> 1.5 + 0.7 - 1.0
    1.2000000000000002

    >>> 0.7
    0.69999999999999996

    Was kriegst Du bei 0.1 ?

    Mehr dazu:
    http://docs.python.org/tut/node16.html


    -(-a → a)

  • Nikon the Third
    3
    Nikon the Third
    Mitglied
    Punkte
    50
    Beiträge
    7
    • 26. Oktober 2007 um 02:17
    • #3

    Tja, das selbe Problem.

    Ich habe es jetzt mit einem regulären Ausdruck gelöst, ist zwar nicht die schönste Variante, aber sie funktioniert ;).

    Code
    String s = new Double(d).toString().replaceFirst("0{2,}\\d+", "")

    Sobald zwei Nullen hintereinander vorkommen, verwerfe ich diese und alle Zahlen, die dann noch kommen.

    Verdammt, da fällt mir gerade auf, dass das bei 0,7 nicht funktioniert...

  • tonico
    7
    tonico
    Mitglied
    Punkte
    465
    Beiträge
    91
    • 26. Oktober 2007 um 02:29
    • #4

    Die Lösung hängt natürlich vom Problem ab. Ich hatte mal ein ähnliches Problem bei einem rekursiven Algorithmus welcher viele Brüche addiert hat. Ich konnte es dadurch lösen, dass ich anstatt immer einen Bruch auszurechnen nur Nenner und Zähler des gekürzten Bruchs in einem Tupel gespeichert habe und mit dem weitergerechnet hab. Das hätte aber nicht funktioniert wenn Zahlen wie Wurzel(2) vorgekommen wären die man nicht als Bruch darstellen kann.


    -(-a → a)

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung