2010-05-31 5 views
23

Ich habe eine doppelte Nummer wie 223.45654543434 und ich muss es wie 0.223x10e+2 zeigen.Format doppelten Wert in wissenschaftlicher Notation

Wie kann ich dies in Java tun?

+9

In korrekter wissenschaftlicher Notation wird die Zahl 2.23e-2, nicht 0.223e-3. – kennytm

+0

... und natürlich meine ich 2.23e + 2, nicht 2.23e-2. Ich behaupte, weil OP die '3' leichter zu bemerken ist als die' -'. – kennytm

Antwort

-4

Schließlich mache ich es von Hand:

public static String parseToCientificNotation(double value) { 
     int cont = 0; 
     java.text.DecimalFormat DECIMAL_FORMATER = new java.text.DecimalFormat("0.##"); 
     while (((int) value) != 0) { 
      value /= 10; 
      cont++; 
     } 
     return DECIMAL_FORMATER.format(value).replace(",", ".") + " x10^ -" + cont; 
} 
+0

sukzessive Teilung !? siehe Antwort unten – ErstwhileIII

+5

Antworten können "unten", "oben" oder nur irgendwo anders sein, abhängig von vielen Faktoren, zum Beispiel wie Sie sie sortieren (am aktivsten, am ältesten, am meisten gewählt). Wenn Sie auf eine andere Antwort verweisen müssen, verlinken Sie darauf (klicken Sie auf "Teilen", um einen Permalink zur Antwort zu erhalten) – Grodriguez

+1

oh nein nein nein nein !! –

21

Von Display numbers in scientific notation. (Kopieren/Einfügen, da die Seite scheint Probleme zu haben)


Sie können Zahlen angezeigt werden in der wissenschaftlichen Notation java.text Paket. Speziell DecimalFormat Klasse in java.text Paket kann für dieses Ziel verwendet werden.

Das folgende Beispiel zeigt, wie dies zu tun:

import java.text.*; 
import java.math.*; 

public class TestScientific { 

    public static void main(String args[]) { 
    new TestScientific().doit(); 
    } 

    public void doit() { 
    NumberFormat formatter = new DecimalFormat(); 

    int maxinteger = Integer.MAX_VALUE; 
    System.out.println(maxinteger); // 2147483647 

    formatter = new DecimalFormat("0.######E0"); 
    System.out.println(formatter.format(maxinteger)); // 2,147484E9 

    formatter = new DecimalFormat("0.#####E0"); 
    System.out.println(formatter.format(maxinteger)); // 2.14748E9 


    int mininteger = Integer.MIN_VALUE; 
    System.out.println(mininteger); // -2147483648 

    formatter = new DecimalFormat("0.######E0"); 
    System.out.println(formatter.format(mininteger)); // -2.147484E9 

    formatter = new DecimalFormat("0.#####E0"); 
    System.out.println(formatter.format(mininteger)); // -2.14748E9 

    double d = 0.12345; 
    formatter = new DecimalFormat("0.#####E0"); 
    System.out.println(formatter.format(d)); // 1.2345E-1 

    formatter = new DecimalFormat("000000E0"); 
    System.out.println(formatter.format(d)); // 12345E-6 
    } 
} 
+8

* "Kopieren/Einfügen, weil die Seite Probleme zu haben scheint" * Auch wenn SO für sich selbst stehen sollte, falls externe Referenzen sich bewegen, geh weg usw. –

+2

wahr genug, aber ich normalerweise nur c/p die wirklich relevanten Teile und dann Link zu der ursprünglichen Quelle für detailliertere Informationen. In diesem Fall funktioniert die ursprüngliche Quelle nicht gut, also lege ich alles hier hinein. –

26
System.out.println(String.format("%6.3e",223.45654543434)); 

Ergebnisse in

2.235e+02 

, die in der Nähe ist ich.

weitere Informationen: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Formatter.html#syntax

+1

Oder 'System.out.printf ("% 6.3e \ n ", 223.23525)' –

+1

Bitte erläutern Sie, was "% 6.3e" bedeutet. Ich kann folgern, dass .3e bedeutet, dass es nur drei Ziffern nach dem. aber was bedeutet die 6? –

+1

@DonLarynx bedeutet, dass es im Ergebnis maximal 6 aussagekräftige Ziffern gibt. Weitere Informationen finden Sie im Link zur Syntax des Formatierungsprogramms. –

-1

Hier ein Thread sichere Implementierung ist:

private static final AtomicReference<NumberFormat> decimalFormatter = new AtomicReference<>(); 
private static final int PRECISION = 9; 

static 
{ 
    decimalFormatter.set(new DecimalFormat("0.0E0")); 
    decimalFormatter.get().setRoundingMode(RoundingMode.HALF_UP); 
    decimalFormatter.get().setMinimumFractionDigits(PRECISION); 
}  


public static String format(final BigInteger integer) 
{ 
    if (null == integer) return null; // could throw NullPointerException here, up to you 
    String output = decimalFormatter.get().format(integer).toLowerCase(); 
    final String sign = output.indexOf('-') >= 0 ? "-" : "+"; 

    if (output.substring(output.indexOf('e')+1).length() < 2) output = output.replace("e", "e" + sign + "0"); 
    else output = output.replace("e", "e" + sign); 

    return output; 
} 
+0

Dies ist nicht threadsicher; Jeder Thread muss einen eigenen Formatierer haben. Das Wrapping einer gemeinsam genutzten Instanz in einer AtomicReference <> 'bringt nichts. Sie müssen entweder 'ThreadLocal' verwenden oder jedes Mal einen neuen Formatierer erstellen, wenn Ihre' format() 'Methode aufgerufen wird. –

9

Diese Antwort wird Zeit für die 40k + Menschen zu retten, die googeln "Java wissenschaftliche Notation."

Was bedeutet Y in %X.YE?

Die Zahl zwischen . und E ist die Anzahl der Dezimalstellen (NICHT die signifikanten Zahlen).

System.out.println(String.format("%.3E",223.45654543434)); 
// "2.235E+02" 
// rounded to 3 decimal places, 4 total significant figures 

Die String.format Methode erfordert, dass Sie die Anzahl der Nachkommastellen angeben abzurunden an. Wenn Sie die genaue Bedeutung der ursprünglichen Zahl beibehalten müssen, benötigen Sie eine andere Lösung.

Was bedeutet X in %X.YE?

Die Zahl zwischen % und . ist die Mindestanzahl von Zeichen bis die Zeichenfolge nehmen. (diese Zahl ist nicht notwendig, da über den den Zeichenfolge dargestellt wird automatisch ausfüllen, wenn Sie es auslassen)

System.out.println(String.format("%3.3E",223.45654543434)); 
// "2.235E+02" <---- 9 total characters 
System.out.println(String.format("%9.3E",223.45654543434)); 
// "2.235E+02" <---- 9 total characters 
System.out.println(String.format("%12.3E",223.45654543434)); 
// " 2.235E+02" <---- 12 total characters, 3 spaces 
System.out.println(String.format("%12.8E",223.45654543434)); 
// "2.23456545E+02" <---- 14 total characters 
System.out.println(String.format("%16.8E",223.45654543434)); 
// " 2.23456545E+02" <---- 16 total characters, 2 spaces 
Verwandte Themen