float to String

kloakenratte

Mitglied
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
 
such dir aus, auf welche stelle du runden willst und runde dann manuell (wenns die zehnte ist, dann geht das dann eh alles weiter, bis nicht mehr nur neuner da sind)

lg
 
Wie soll ich mir das aussuchen? Wie gesagt, ich darf keine wichtigen Nachkommastellen verlieren. Es soll aber das richtige Ergebnis rauskommen und wenn das Ergebnis 31.349999 ist, dann ist eigentlich die Zahl 31.35 gemeint.
 
Hallo,

in dem erhaltenen genauen String mit indexOf nach 9 suchen, wenn die hinter dem Komma zweimal hintereinander auftaucht die Stelle davor mit dem nächsthöheren Wert belegen und den Rest abschneiden. Was einfacheres fällt mir im Moment Leider nicht ein.
 
Ist halt keine schöne Lösung finde ich. Da muss es doch eine Möglichkeit geben den float richtig zu casten. Wäre meiner Meinung nach ein ziemlicher schmarrn, wenn man das so mühsam machen muss.
 
Also soweit ich das sehe, ist BigDecimal die richtige Entscheidung, da mit float und double leicht Rundungsfehler auftreten. Aus diesem Grund ist abcjks Lösung nicht einmal im geringsten verwendbar, da nicht immer 9er zum Schluss auftreten können, sondern auch andere Zahlen.
 
überleg dir, ab welcher stelle du das ganze nicht mehr brauchst --> bis fe zwanzig dezimalstellen braucht das eh keiner --> hab ich gemeint

lg
 
ICH BRAUCHE JEDE STELLE ZWECKS GENAUIGKEIT... nur die Rundungsfehler sollten abgeschnitten werden.

Beispiel:
0.217 - 0.211 = 0.006

double: 0.00599999725818634
float: 0.0059999973
BigDecimal: 0.0060000000000000053290705182007513940334320068359375000

Und nein, ich werde jetzt nicht hergehen und ein Format von "0.000" definieren, weil es genauso vorkommen kann, dass ich ein Ergebnis mit 4 Nachkommastellen erhalte.
Also bitte nicht so unsinnige Antworten schreiben, weil mir diese nichts bringen. Hier geht es um Genauigkeit. Und da kann ich nicht hergehen und lustig sein und sagen, nein 3 Nachkommastellen sollten reichen.
 
Wenn du mit Fließkommazahlen rechnest treten nun einmal Rundungsfehler auf, das geht nicht anders. Um das zu umgehen bleibt dir nichts anderes übrig als die BigDecimal mit einem String anstatt einer Fließkommazahl zu initialisieren.
Java:
new BigDecimal("0.217").subtract(new BigDecimal("0.211")); // 0.006
new BigDecimal(0.217).subtract(new BigDecimal(0.211)); // 0.0060000000000000053290705182007513940334320068359375000
Wenn du einen String angibst wird BigDecimal auch tatsächlich mit diesem String initialisiert, bei einem Double hingegen erfolgt die Initialisierung über die Binärdarstellung des Doubles weshalb es zu den Ungenauigkeiten kommt.
 
Beschäftige dich bitte erst einmal etwas mit Numerik und Fehlerrechnung wenn du solche Anforderungen hast, dann verstehst du auch warum solche Nachkommastellen unvermeidlich sind und wie man damit umgeht.
 
Ich habe schon verstanden, weshalb diese Rundungsfehler passieren. Habe bereits genug darüber gelesen, aber leider noch keine verwertbare Lösung gefunden.
Danke für den Tipp mit der Initialisierung des Strings, Antoras!! Klappt ja soweit super. 🙂
 

Zurück
Oben