Ich habe einen primitiven Float und ich brauche als primitiven Double. Wenn ich den Schwimmer einfach verdopple, bekomme ich seltsame zusätzliche Präzision. Beispielsweise:
float temp = 14009.35F;
System.out.println(Float.toString(temp)); // Prints 14009.35
System.out.println(Double.toString((double)temp)); // Prints 14009.349609375
Wenn ich jedoch anstelle des Castings den Float als String ausgeben und den String als Double analysieren möchte, erhalte ich das, was ich will:
System.out.println(Double.toString(Double.parseDouble(Float.toString(temp))));
// Prints 14009.35
Gibt es einen besseren Weg als nach String und zurück zu gehen?
quelle
Verwenden Sie ein
BigDecimal
anstelle vonfloat
/double
. Es gibt viele Zahlen, die nicht als binäres Gleitkomma dargestellt werden können (z. B.0.1
). Sie müssen das Ergebnis also entweder immer auf eine bekannte Genauigkeit runden oder verwendenBigDecimal
.Weitere Informationen finden Sie unter http://en.wikipedia.org/wiki/Floating_point .
quelle
BigDecimal
da dies die meisten häufigen Fehler auffängt. Wenn die Dinge zu langsam sind, müssen sie mehr lernen und Wege finden, um ihre Probleme zu optimieren. Vorzeitige Optimierung ist die Wurzel allen Übels - DE Knuth.Ich habe folgende Lösung gefunden:
Wenn Sie float und double anstelle von Float und Double verwenden, verwenden Sie Folgendes:
quelle
Schwimmer sind von Natur aus ungenau und haben immer ordentliche Rundungsprobleme. Wenn Präzision wichtig ist, können Sie Ihre Anwendung so umgestalten, dass sie Decimal oder BigDecimal verwendet.
Ja, Floats sind aufgrund der Unterstützung des Prozessors rechnerisch schneller als Dezimalstellen. Wollen Sie jedoch schnell oder genau?
quelle
Weitere Informationen finden Sie unter Punkt 48 - Vermeiden Sie Float und Double, wenn genaue Werte erforderlich sind, von Effective Java 2nd Edition von Joshua Bloch. Dieses Buch ist vollgepackt mit guten Sachen und auf jeden Fall einen Blick wert.
quelle
Funktioniert das?
quelle
Eine einfache Lösung, die gut funktioniert, besteht darin, das Double aus der String-Darstellung des Floats zu analysieren:
Nicht super effizient, aber es funktioniert!
quelle