2016-05-19 24 views
2

Wenn ich versuche, die folgende Zeichenfolge in einem Schwimmer zu analysieren und in ein Doppel:String zu schweben/double Parsing

String abc = "8.40"; 
System.out.println("Double Value: " + Double.parseDouble(abc) * 100); 
System.out.println("Float Value: " + Float.parseFloat(abc) * 100); 

ich zwei unterschiedliche Ergebnisse.

Double Value: 840.0 
Float Value: 839.99994 

Aber wenn ich den gleichen Code versuchen, mit dem Schwimmer und Doppel von 10 oder 1000 multipliziert bekomme ich die ähnlichen Ergebnisse für beide.

String abc = "8.40"; 
System.out.println("Double Value: " + Double.parseDouble(abc) * 10); 
System.out.println("Float Value: " + Float.parseFloat(abc) * 10); 

Ich bekomme zwei ähnliche Ergebnisse.

Double Value: 84.0 
Float Value: 84.0 

Und wenn ich versuche, dies:

String abc = "8.40"; 
System.out.println("Double Value: " + Double.parseDouble(abc) * 1000); 
System.out.println("Float Value: " + Float.parseFloat(abc) * 1000); 

ich zwei ähnliche Ergebnisse.

Double Value: 8400.0 
Float Value: 8400.0 
+4

Ok. Was ist die Frage? 'Float' hat eine geringere Genauigkeit als' Double'. – Vyacheslav

+0

Tritt das gleiche auf, wenn Sie '' System.out.println ("Float Value:" + Float.parseFloat ("8.40f") * 100) verwenden; '' '? – m4mbax

Antwort

3

Dieses feine funktioniert:

System.out.println("Float Value: "+Math.round((float)Float.parseFloat(abc)*100)); 

Also, dies geschieht aufgrund der unterschiedlichen Darstellung double und float, genauer gesagt, über IEEE-754 float für die Rundung. Lesen Sie darüber here.

float hat eine kleinere Reichweite und Präzision, so double wäre besser, wenn Sie Speicher haben (was Sie heute tun). Aber sie sind beide böse! Es gibt eine bessere Option in Java namens BigDecimal und Sie sollten es verwenden, da es kein Problem mit der Größe hat und wir heute starke Computer haben, so dass wir keine Probleme mit Speicher und Geschwindigkeit haben werden, wenn wir mit einer großen Anzahl von benötigten Dezimalzahlen zu tun haben maximale Präzision. Zum Beispiel, wenn Sie an Software arbeiten, die mit vielen Geldtransaktionen beschäftigt, ist es ein Muss zu verwenden BigDecimal.

+0

BigDecimal, Float und Double haben alle eine gute Verwendung. Ich habe Situationen gesehen, in denen jeder eine viel bessere Wahl als jeder der beiden anderen ist. Immer BigDecimal zu verwenden, ist ein ebenso schwerwiegender Fehler wie immer eines der beiden anderen zu verwenden. –

+0

@PatriciaShanahan Nur die Verwendung heute kann ich an einige Mikroprozessoren mit einigen schnellen Sensoren denken, also würde BigDecimal Verarbeitung wegen der nicht parallelen Verarbeitung und langsamer CPU zu viel Zeit in Anspruch nehmen .. die meisten SE und EE basierten Projekte würden große Mengen von BigDecimals verarbeiten weniger als 1ms, sollte also keine Probleme mit der Geschwindigkeit machen.Sogar der Speicher sollte OK sein, denn für große EE-basierte Projekte kann man sich genügend RAM leisten und Java 8 macht es super (arbeitete mit einem solchen SE-basierten Projekt, behandelte perfekte Cache-Größe von 30 + GB und verwendete immer Integer, Long, Double , BigDecimal, etc. - Lange verwendet, sogar als IDs) –

+0

Sie scheinen in Bezug auf die Annahme von Problemen Größen, die auf älteren Computern gelöst werden könnten, und vorausgesetzt, dass das alles ist, dass aktuelle Computer ausgeführt werden müssen. Ich werde nur ein Feld nehmen. Vor vielen Jahren sah ich eine Präsentation von einem Computerchemiker. Er hatte ein Diagramm mit logarithmischen Skalen von Gleitkommaoperationen pro Sekunde auf einer Achse, Speichergröße auf der anderen Seite, gefüllt mit Problemen, die er mit diesen Ressourcen bearbeiten würde. Das Diagramm erweiterte Größenordnungen über aktuelle Leistung und Speicher. –

2

Es ist wahr, dass double mehr Präzision als float hat, aber beide leiden unter dem gleichen Problem: ihr Wert kann nicht genau sein, und sie haben beide einige (kleine) Rundungsfehler in ihrem Least Significant Bit (LSB) . Dies ist in dem ersten Ergebnis klar, das Sie erhalten haben: float Wert ist nicht genau. Aber wenn Sie mit 10 oder 1000 multiplizieren, wird das LSB aus dem Ergebnis verworfen, und so erhalten Sie die richtige Antwort für beide float und double.

+0

Ein nettes Werkzeug, das das Problem zeigt, ist dieses: http://www.h-schmidt.net/FloatConverter/IEEE754.html – Alexander