float to String casten

kloakenratte

Grünschnabel
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
 
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ß
 
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/zahl/bigdecimal-double-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.
 
Hi

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:
Java:
float f=...;
long l=(long)(f*1000);
f=((float)l)/1000;

Gruß
 

Neue Beiträge

Zurück