tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
846
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    kloakenratte kloakenratte ist offline Mitglied
    Registriert seit
    Feb 2008
    Beiträge
    16
    Hallo!

    Also ich würde gerne einen float in einen String konvertieren nach einer Rechenoperation. Wichtig dabei ist, dass ich keine Nachkommastellen verliere.
    Jetzt kann es vorkommen, dass ich nach der Rechenoperation beispielsweise eine Zahl bekomme, die aber aufgerundet gehört, zb. 32.823999999, weil das korrekte Ergebnis eben 32.824 wäre.

    Mit dem DecimalFormatter kann ich wohl nicht arbeiten, da ich eben nie wissen kann, wieviele Nachkommastellen das Ergebnis haben wird.
    DecimalFormat formatter = new DecimalFormat("0.000");
    String str = formatter.format(fltValue);

    Bei einem dirty cast, werden zwar alle Nachkommastellen korrekt übernommen, aber nur, wenn obiges Beispiel kein Ergebnis mit nachfolgenden 9ern liefert, die eigentlich aufgerundet gehören.
    String str = Float.toString(fltValue);

    Für Ideen und Tipps bin ich dankbar!

    LG
     

  2. #2
    alphaChill alphaChill ist offline Mitglied
    Registriert seit
    Oct 2007
    Beiträge
    19
    Wie wär's wenn du dir eine Methode schreibst, die einfach prüft, ob gerundet werden muss oder nicht und wenn gerundet werden muss, dann lässt du runden und ansonsten halt nicht
    Einfach den Float in einen String casten - würd es ganz simptel mit:
    float f = 999.9f;
    String = ""+f;
    machen. Dann den String in ein CharArray packen (toCharArray()), das Array rückwärts durchlaufen lassen und prüfen, habe ich an den ersten Stellen (von hinten gelesen) nur 9er, dann den Float runden (man kann ja jetzt auch bestimmen auf wieviel Stellen gerundet werden soll) und wieder wie oben gezeigt, auf einen Strng casten, sonst gleich casten.

    Gruß
     

  3. #3
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Zitat Zitat von kloakenratte Beitrag anzeigen
    Jetzt kann es vorkommen, dass ich nach der Rechenoperation beispielsweise eine Zahl bekomme, die aber aufgerundet gehört, zb. 32.823999999, weil das korrekte Ergebnis eben 32.824 wäre.
    Woher weißt du, dass die Zahl gerundet werden müsste? Woran machst du das fest?
     

  4. #4
    kloakenratte kloakenratte ist offline Mitglied
    Registriert seit
    Feb 2008
    Beiträge
    16
    Für alle die dieses Problem haben, hier die Lösung:
    Bei double und float passieren Rundungsfehler. Das Problem ist ein Problem der Prozessor aArchitektur, soweit ich weiß. Bestimmte Zahlen können nicht genau dargestellt werden (werden ja nach IEEE Standard als Binärzahl gespeichert und behandelt).
    Der Datentyp BigDecimal hilft.
    http://www.i-coding.de/www/de/java/z...ble-float.html

    Beispiel:

    Beispiel:
    0.217 - 0.211 = 0.006

    double: 0.00599999725818634
    float: 0.0059999973

    Wichtig:
    new BigDecimal("0.217").subtract(new BigDecimal("0.211")); // 0.006
    new BigDecimal(0.217).subtract(new BigDecimal(0.211)); // 0.0060000000000000053290705182007513940334320068359375000

    BigDecimal muss als String initialisiert werden und nicht als double, weil sonst wieder eine Initialisierung über Binärdarstellung geschieht und dann wieder diese Rundungsfehler auftreten.
     

  5. #5
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Hi

    Zitat Zitat von kloakenratte Beitrag anzeigen
    Bei double und float passieren Rundungsfehler
    Das ist vollkommen normal. Sowas passiert eben, wenn man eine Kommazahl mit bis zu unendlich viel Kommastellen in 32 Einser und Nuller packen probiert.

    Solange es in einem bestimmten Zahlenbereich/Genauigkeitsbreich bleibt, hilft auch einfach sowas:
    zB Wenn man auf 3 Kommastellen runden will:
    Code java:
    1
    2
    3
    
    float f=...;
    long l=(long)(f*1000);
    f=((float)l)/1000;

    Gruß
     

  6. #6
    kloakenratte kloakenratte ist offline Mitglied
    Registriert seit
    Feb 2008
    Beiträge
    16
    Ich will nicht runden, ich will ein genaues Ergebnis und da ist nunmal BigDecimal die einzige Lösung.
     

  7. #7
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.806
    Blog-Einträge
    5
    Hallo,

    auch wenn das Thema eigentlich schon erledigt ist, möchte ich dennoch einen Verweis auf die hervorragende Seite http://www.floating-point-gui.de/ hier lassen.

    Grüße,
    Matthias
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

Ähnliche Themen

  1. [ABAP] String in int casten?
    Von Jantz im Forum Sonstige Sprachen
    Antworten: 2
    Letzter Beitrag: 05.06.09, 11:45
  2. int zu String casten
    Von noel1982 im Forum VisualStudio & MFC
    Antworten: 3
    Letzter Beitrag: 23.06.05, 13:26
  3. String in Datum casten
    Von Shizzl_chrizzl im Forum Java
    Antworten: 6
    Letzter Beitrag: 24.11.04, 13:27
  4. Antworten: 3
    Letzter Beitrag: 19.11.04, 09:40
  5. casten from string to list
    Von yidaki im Forum Java
    Antworten: 7
    Letzter Beitrag: 16.07.04, 14:00