Protip: Wenn Sie verwirrt sind, warum diese zufälligen Ziffern jenseits einer bestimmten Schwelle im Double-Wert erscheinen, erklärt dieses Video: computerphile why does 0.1+0.2 gleich 0.30000000000001?
Dies wird gedruckt dexp: 12345678.000000. Wenn Sie den Bruchteil nicht möchten, verwenden Sie
System.out.printf("dexp: %.0f\n", dexp);
0 Zoll %.0f bedeutet 0 Stellen im Bruchteil, dh kein Bruchteil. Wenn Sie einen Bruchteil mit der gewünschten Anzahl von Dezimalstellen drucken möchten, geben Sie anstelle von 0 einfach die Zahl wie folgt ein %.8f. Standardmäßig wird der Bruchteil mit bis zu 6 Dezimalstellen gedruckt.
Dies verwendet die Formatbezeichnersprache, die in erläutert wird Dokumentation.
Der Standard toString() Format, das in Ihrem ursprünglichen Code verwendet wird, wird ausgeschrieben Hier.
aber es zeigte sich dexp: 12345681.000000 Das ist ein falscher Wert. Und eigentlich möchte ich es danach auf meiner Webseite anzeigen, wo es so angezeigt wird 1.2345678E7.Gibt es irgendwie, durch die ich es in jedem Doppel wie speichern kann 12345678 und sonst irgendwie?
– Verabscheuungswürdig
19. April 2013 um 5:56 Uhr
@despicable: Möglicherweise haben Sie sich die alte, unvollständige Version der Antwort angesehen. Versuchen Sie, die Seite neu zu laden. Es sollte einen Absatz darüber geben %.0f.
– NPE
19. April 2013 um 5:57 Uhr
@despicable Sie könnten dexp als int speichern, damit Sie es problemlos in beide Richtungen verwenden können
– Justin
19. April 2013 um 5:58 Uhr
ES RUNDET DIE ZAHL AB
– Verwirren
12. März 2015 um 16:15 Uhr
%.0f rundet die Zahl ab. Gibt es eine Möglichkeit, die abschließenden Nullen einfach zu verwerfen?
– NurShomik
23. Januar 2017 um 19:59 Uhr
JBE
Zusamenfassend:
Wenn Sie nachgestellte Nullen und Locale-Probleme loswerden möchten, sollten Sie Folgendes verwenden:
Double.toString() oder System.out.println oder FloatingDecimal.toJavaFormatString verwendet wissenschaftliche Notationen, wenn double kleiner als 10^-3 oder größer oder gleich 10^7 ist
Durch die Nutzung %f, die Standard-Dezimalgenauigkeit ist 6, andernfalls können Sie sie fest codieren, aber es führt dazu, dass zusätzliche Nullen hinzugefügt werden, wenn Sie weniger Dezimalstellen haben. Beispiel:
Durch die Nutzung setMaximumFractionDigits(0); oder %.0f Sie entfernen jede Dezimalgenauigkeit, was für Ganzzahlen/Longs in Ordnung ist, aber nicht für Double:
Die Verwendung des Gebietsschemas ENGLISH stellt sicher, dass Sie einen Punkt für das Dezimaltrennzeichen erhalten, wo immer Ihr Programm ausgeführt wird.
Warum dann 340 verwenden? setMaximumFractionDigits?
Zwei Gründe:
setMaximumFractionDigits akzeptiert eine Ganzzahl, aber ihre Implementierung hat eine maximal zulässige Anzahl von Ziffern DecimalFormat.DOUBLE_FRACTION_DIGITS was 340 entspricht
Double.MIN_VALUE = 4.9E-324 Mit 340 Stellen runden Sie also sicher nicht Ihr Doppel und verlieren an Präzision.
Was ist Ihre Meinung dazu new BigDecimal(myvalue).toPlainString() Aus der Beschreibung bei docs.oracle.com/javase/7/docs/api/java/math/…), es ist nicht sofort ersichtlich, wie es sich verhält, wenn verschiedene Arten von Zahlen angegeben werden, aber es eliminiert die wissenschaftliche Notation.
– Derek Mahar
7. April 2015 um 15:22 Uhr
new BigDecimal(0.00000021d).toPlainString() Ausgang 0.0000002100000000000000010850153241148685623329583904705941677093505859375 was man nicht erwarten würde…
– JBE
7. April 2015 um 19:06 Uhr
Haben Sie eine Idee, wie Sie Ihre Antwort in Scala verwenden können? wahrscheinlich eine Frage des entsprechenden Imports aber ich bin neu hier.
– Jangorecki
1. August 2016 um 16:54 Uhr
BigDecimal.valueOf(0.00000021d).toPlainString() funktioniert auch (es verwendet den String-Konstruktor von BigDecimal, deshalb)
– Marco
13. August 2019 um 0:33 Uhr
Diese Antwort funktioniert nicht gut für Schwimmer: 24.728352f wird "24.728351593017578".
– NateS
18. August 2021 um 1:49 Uhr
Du kannst es damit versuchen DecimalFormat. Mit dieser Klasse sind Sie beim Parsen Ihrer Zahlen sehr flexibel.
Sie können genau das Muster einstellen, das Sie verwenden möchten.
In Ihrem Fall zum Beispiel:
double test = 12345678;
DecimalFormat df = new DecimalFormat("#");
df.setMaximumFractionDigits(0);
System.out.println(df.format(test)); //12345678
Manuel
Ich habe eine andere Lösung mit BigDecimals toPlainString(), aber diesmal mit dem String-Konstruktor, der im Javadoc empfohlen wird:
Dieser Konstruktor ist mit den von Float.toString und Double.toString zurückgegebenen Werten kompatibel. Dies ist im Allgemeinen die bevorzugte Methode, um ein Float oder Double in ein BigDecimal umzuwandeln, da es nicht unter der Unvorhersehbarkeit des BigDecimal(double)-Konstruktors leidet.
Das sieht in seiner kürzesten Form so aus:
return new BigDecimal(myDouble.toString()).stripTrailingZeros().toPlainString();
NaN und unendliche Werte müssen extra überprüft werden, sieht also in seiner vollständigen Form so aus:
public static String doubleToString(Double d) {
if (d == null)
return null;
if (d.isNaN() || d.isInfinite())
return d.toString();
return new BigDecimal(d.toString()).stripTrailingZeros().toPlainString();
}
Dies kann auch kopiert/eingefügt werden, um gut mit Float zu arbeiten.
Für Java 7 und niedriger ergibt dies “0.0” für alle nullwertigen Doubles, also müssten Sie Folgendes hinzufügen:
if (d.doubleValue() == 0)
return "0";
Ich habe unzählige Schemata gelesen, um einen Double-Wert in einen String umzuwandeln, und das ist das Beste: kurz, unkompliziert, konfigurierbar.
– Paulus
17. November 2016 um 19:47 Uhr
Warum d.doubleValue() == 0 anstatt d == 0?
– Alexej Fando
27. Oktober 2017 um 14:33 Uhr
Weil es Auto-Unboxing vermeidet, was mir in dieser Situation besser gefällt, aber die Ansichten können natürlich darüber auseinander gehen. Wenn Sie Java 8 verwenden (9 wird wahrscheinlich dasselbe sein), können Sie diese beiden Zeilen ganz weglassen.
– Manuel
30. Oktober 2017 um 15:40 Uhr
Gerade mit Java 9 ausprobiert, diese 2 Zeilen können auch auf 9 weggelassen werden.
– Manuel
30. Oktober 2017 um 16:04 Uhr
Erich Leschinski
Dies funktioniert, solange Ihre Zahl eine ganze Zahl ist:
Wenn die Double-Variable eine Genauigkeit nach dem Dezimalkomma hat, wird sie abgeschnitten.
Ich habe unzählige Schemata gelesen, um einen Double-Wert in einen String umzuwandeln, und das ist das Beste: kurz, unkompliziert, konfigurierbar.
– Paulus
17. November 2016 um 19:47 Uhr
Warum d.doubleValue() == 0 anstatt d == 0?
– Alexej Fando
27. Oktober 2017 um 14:33 Uhr
Weil es Auto-Unboxing vermeidet, was mir in dieser Situation besser gefällt, aber die Ansichten können natürlich darüber auseinander gehen. Wenn Sie Java 8 verwenden (9 wird wahrscheinlich dasselbe sein), können Sie diese beiden Zeilen ganz weglassen.
– Manuel
30. Oktober 2017 um 15:40 Uhr
Gerade mit Java 9 ausprobiert, diese 2 Zeilen können auch auf 9 weggelassen werden.
– Manuel
30. Oktober 2017 um 16:04 Uhr
Der Java/Kotlin-Compiler konvertiert jeden Wert größer als 9999999 (größer oder gleich 10 Millionen) in die wissenschaftliche Notation, dh. Epsilon-Notation.
Beispiel: 12345678 wird in 1,2345678E7 umgewandelt
Verwenden Sie diesen Code, um die automatische Konvertierung in die wissenschaftliche Notation zu vermeiden:
fun setTotalSalesValue(String total) {
var valueWithoutEpsilon = total.toBigDecimal()
/* Set the converted value to your android text view using setText() function */
salesTextView.setText( valueWithoutEpsilon.toPlainString() )
}
9643700cookie-checkWie drucke ich einen doppelten Wert ohne wissenschaftliche Notation mit Java?yes