Ich möchte einen doppelten Wert in Java ohne Exponentialform drucken.
double dexp = 12345678;
System.out.println("dexp: "+dexp);
Es zeigt diese E-Notation : 1.2345678E7
.
Ich möchte, dass es so gedruckt wird: 12345678
Was ist der beste Weg, um dies zu verhindern?
dexp: 12345681.000000
welcher Wert falsch ist. Und tatsächlich möchte ich ihn danach auf meiner Webseite anzeigen, wo er so angezeigt wird.1.2345678E7
Gibt es sowieso einen Ort, über den ich ihn in beliebiger doppelter12345678
und anderer Weise speichern kann ?%.0f
.%.0f
rundet die Zahl ab. Gibt es eine Möglichkeit, die nachgestellten Nullen einfach zu verwerfen?Java verhindert die E-Notation im Doppelpack:
Fünf verschiedene Möglichkeiten, ein Double in eine normale Zahl umzuwandeln:
Dieses Programm druckt:
Welches sind alle den gleichen Wert.
Protip: Wenn Sie sich nicht sicher sind, warum diese zufälligen Ziffern im doppelten Wert über einem bestimmten Schwellenwert liegen, erklärt dieses Video: Computerphile, warum ist
0.1
+0.2
gleich0.30000000000001
?http://youtube.com/watch?v=PZRI1IfStY0
quelle
Zusamenfassend:
Wenn Sie nachgestellte Nullen und Gebietsschemaprobleme beseitigen möchten, sollten Sie Folgendes verwenden:
Erläuterung:
Warum andere Antworten nicht zu mir passten:
Double.toString()
oderSystem.out.println
oderFloatingDecimal.toJavaFormatString
verwendet wissenschaftliche Notationen, wenn double kleiner als 10 ^ -3 oder größer oder gleich 10 ^ 7 istBei Verwendung
%f
beträgt die Standard-Dezimalgenauigkeit 6, andernfalls können Sie sie fest codieren. Wenn Sie jedoch weniger Dezimalstellen haben, werden zusätzliche Nullen hinzugefügt. Beispiel:Durch Verwenden
setMaximumFractionDigits(0);
oder%.0f
Entfernen einer Dezimalgenauigkeit, die für Ganzzahlen / Longs, aber nicht für Double in Ordnung ist:Durch die Verwendung von DecimalFormat sind Sie lokal abhängig. Im französischen Gebietsschema ist das Dezimaltrennzeichen ein Komma, kein Punkt:
Durch die Verwendung des Gebietsschemas ENGLISH wird sichergestellt, dass Sie überall dort, wo Ihr Programm ausgeführt wird, einen Punkt für das Dezimaltrennzeichen erhalten.
Warum dann 340 für
setMaximumFractionDigits
?Zwei Gründe:
setMaximumFractionDigits
akzeptiert eine Ganzzahl, aber für die Implementierung sind maximal Ziffern zulässig, vonDecimalFormat.DOUBLE_FRACTION_DIGITS
denen 340 entsprichtDouble.MIN_VALUE = 4.9E-324
Mit 340 Stellen können Sie also sicher sein, dass Sie Ihr Doppel nicht runden und an Präzision verlieren.quelle
new BigDecimal(myvalue).toPlainString()
Aus der Beschreibung unter docs.oracle.com/javase/7/docs/api/java/math/… ) geht nicht sofort hervor, wie es sich verhält, wenn verschiedene Arten von Zahlen angegeben werden, aber es beseitigt die wissenschaftliche Notation .new BigDecimal(0.00000021d).toPlainString()
Ausgabe,0.0000002100000000000000010850153241148685623329583904705941677093505859375
die nicht das ist, was Sie erwarten würden ...BigDecimal.valueOf(0.00000021d).toPlainString()
funktioniert auch (es verwendet den String-Konstruktor von BigDecimal, deshalb)Sie können es mit versuchen
DecimalFormat
. Mit dieser Klasse können Sie Ihre Zahlen sehr flexibel analysieren.Sie können genau das Muster einstellen, das Sie verwenden möchten.
In Ihrem Fall zum Beispiel:
quelle
Ich habe eine andere Lösung mit toPlainString () von BigDecimal, aber diesmal mit dem String-Konstruktor, der im Javadoc empfohlen wird:
Es sieht in seiner kürzesten Form so aus:
Vor Java 8 ergibt dies "0.0" für alle nullwertigen Doubles. Sie müssten also Folgendes hinzufügen:
NaN- und unendliche Werte müssen zusätzlich überprüft werden.
Das Endergebnis all dieser Überlegungen:
Dies kann auch kopiert / eingefügt werden, um mit Float gut zu funktionieren.
quelle
d.doubleValue() == 0
stattd == 0
?Dies funktioniert, solange Ihre Nummer eine ganze Nummer ist:
Wenn die Doppelvariable nach dem Dezimalpunkt genau ist, wird sie abgeschnitten.
quelle
Ich musste einige doppelte in Währungswerte umrechnen und stellte fest, dass die meisten Lösungen in Ordnung waren, aber nicht für mich.
Das
DecimalFormat
war schließlich der Weg für mich, also habe ich Folgendes getan:Wie Sie sehen können, erhalte ich, wenn die Zahl natürlich ist, beispielsweise 20000000 anstelle von 2E7 (usw.) ohne Dezimalpunkt.
Und wenn es dezimal ist, bekomme ich nur zwei Dezimalstellen.
quelle
Der Java / Kotlin-Compiler konvertiert jeden Wert größer als 9999999 (größer oder gleich 10 Millionen) in wissenschaftliche Notation, d. H. Epsilion Notation .
Beispiel: 12345678 wird in 1.2345678E7 konvertiert
Verwenden Sie diesen Code, um eine automatische Konvertierung in wissenschaftliche Notation zu vermeiden:
quelle
Der folgende Code erkennt, ob die angegebene Nummer in wissenschaftlicher Notation angegeben ist. Wenn ja, wird es in normaler Darstellung mit maximal 25 Ziffern dargestellt.
quelle
Ich denke, jeder hatte die richtige Idee, aber alle Antworten waren nicht einfach. Ich kann sehen, dass dies ein sehr nützlicher Code ist. Hier ist ein Ausschnitt dessen, was funktionieren wird:
das
".8"
ist , wo Sie die Anzahl der Dezimalstellen festgelegt würden Sie gerne zeigen.Ich benutze Eclipse und es hat kein Problem funktioniert.
Hoffe das war hilfreich. Ich würde mich über Feedback freuen!
quelle
Ich hatte das gleiche Problem in meinem Produktionscode, als ich ihn als Zeichenfolgeneingabe für eine math.Eval () -Funktion verwendete, die eine Zeichenfolge wie "x + 20/50" verwendet.
Ich habe mir Hunderte von Artikeln angesehen ... Am Ende habe ich mich wegen der Geschwindigkeit dafür entschieden. Und weil die Eval-Funktion es irgendwann wieder in ihr eigenes Zahlenformat konvertieren würde und math.Eval () das nachfolgende E-07, das andere Methoden zurückgaben, nicht unterstützte und alles über 5 dp sowieso zu detailliert für meine Anwendung war .
Dies wird jetzt im Produktionscode für eine Anwendung mit mehr als 1.000 Benutzern verwendet ...
quelle
Dies mag eine Tangente sein ... aber wenn Sie einen numerischen Wert als Ganzzahl (die zu groß ist, um eine Ganzzahl zu sein) in einen Serializer (JSON usw.) eingeben müssen, möchten Sie wahrscheinlich "BigInterger"
Beispiel: Wert ist eine Zeichenfolge - 7515904334
Wir müssen es als Zahl in einer Json-Nachricht darstellen: {"contact_phone": "800220-3333", "servicer_id": 7515904334, "servicer_name": "SOME CORPORATION"}
Wir können es nicht drucken oder wir bekommen folgendes: {"contact_phone": "800220-3333", "servicer_id": "7515904334", "servicer_name": "SOME CORPORATION"}
Wenn Sie den Wert wie folgt zum Knoten hinzufügen, erhalten Sie das gewünschte Ergebnis: BigInteger.valueOf (Long.parseLong (Wert, 10))
Ich bin mir nicht sicher, ob dies wirklich ein Thema ist, aber da diese Frage mein Top-Hit war, als ich nach meiner Lösung suchte, dachte ich, ich würde sie hier zum Nutzen anderer teilen, lüge mich, die schlecht suchen. : D.
quelle
Für ganzzahlige Werte, die durch a dargestellt werden
double
, können Sie diesen Code verwenden, der viel schneller als die anderen Lösungen ist.quelle
Meine Lösung: String str = String.format ("% .0f", yourDouble);
quelle