Wie drucke ich einen doppelten Wert ohne wissenschaftliche Notation mit Java?

Lesezeit: 7 Minuten

Wie drucke ich einen doppelten Wert ohne wissenschaftliche Notation mit
Verabscheuungswürdig

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, dies zu verhindern?

Wie drucke ich einen doppelten Wert ohne wissenschaftliche Notation mit
Erich Leschinski

Java verhindert die E-Notation in einem Double:

Fünf verschiedene Möglichkeiten, ein Double in eine normale Zahl umzuwandeln:

import java.math.BigDecimal;
import java.text.DecimalFormat;

public class Runner {
    public static void main(String[] args) {
        double myvalue = 0.00000021d;

        //Option 1 Print bare double.
        System.out.println(myvalue);

        //Option2, use decimalFormat.
        DecimalFormat df = new DecimalFormat("#");
        df.setMaximumFractionDigits(8);
        System.out.println(df.format(myvalue));

        //Option 3, use printf.
        System.out.printf("%.9f", myvalue);
        System.out.println();

        //Option 4, convert toBigDecimal and ask for toPlainString().
        System.out.print(new BigDecimal(myvalue).toPlainString());
        System.out.println();

        //Option 5, String.format 
        System.out.println(String.format("%.12f", myvalue));
    }
}

Dieses Programm druckt:

2.1E-7
.00000021
0.000000210
0.000000210000000000000001085015324114868562332958390470594167709350585
0.000000210000

Welche alle den gleichen Wert haben.

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?

http://youtube.com/watch?v=PZRI1IfStY0

  • Es sagt uns nur, wie der doppelte Wert gedruckt wird. Was ist, wenn ich es als JSON zurückgeben möchte?

    – Fakipo

    28. September 2020 um 11:48 Uhr

1646641630 171 Wie drucke ich einen doppelten Wert ohne wissenschaftliche Notation mit
NPE

Du könntest benutzen printf() mit %f:

double dexp = 12345678;
System.out.printf("dexp: %f\n", dexp);

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

1646641631 439 Wie drucke ich einen doppelten Wert ohne wissenschaftliche Notation mit
JBE

Zusamenfassend:

Wenn Sie nachgestellte Nullen und Locale-Probleme loswerden möchten, sollten Sie Folgendes verwenden:

double myValue = 0.00000021d;

DecimalFormat df = new DecimalFormat("0", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
df.setMaximumFractionDigits(340); // 340 = DecimalFormat.DOUBLE_FRACTION_DIGITS

System.out.println(df.format(myValue)); // Output: 0.00000021

Erläuterung:

Warum andere Antworten nicht zu mir passten:

  • 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:

    double myValue = 0.00000021d;
    String.format("%.12f", myvalue); // Output: 0.000000210000
    
  • Durch die Nutzung setMaximumFractionDigits(0); oder %.0f Sie entfernen jede Dezimalgenauigkeit, was für Ganzzahlen/Longs in Ordnung ist, aber nicht für Double:

    double myValue = 0.00000021d;
    System.out.println(String.format("%.0f", myvalue)); // Output: 0
    DecimalFormat df = new DecimalFormat("0");
    System.out.println(df.format(myValue)); // Output: 0
    
  • Durch die Verwendung von DecimalFormat sind Sie ortsabhängig. Im französischen Gebietsschema ist das Dezimaltrennzeichen ein Komma, kein Punkt:

    double myValue = 0.00000021d;
    DecimalFormat df = new DecimalFormat("0");
    df.setMaximumFractionDigits(340);
    System.out.println(df.format(myvalue)); // Output: 0,00000021
    

    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

1646641631 80 Wie drucke ich einen doppelten Wert ohne wissenschaftliche Notation mit
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

Wie drucke ich einen doppelten Wert ohne wissenschaftliche Notation mit
Erich Leschinski

Dies funktioniert, solange Ihre Zahl eine ganze Zahl ist:

double dnexp = 12345678;
System.out.println("dexp: " + (long)dexp);

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() )
    }

964370cookie-checkWie drucke ich einen doppelten Wert ohne wissenschaftliche Notation mit Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy