2010-05-31 14 views
23

Ho un numero doppio come 223.45654543434 e ho bisogno di mostrarlo come 0.223x10e+2.Formato doppio valore in notazione scientifica

Come posso farlo in Java?

+9

In una corretta notazione scientifica il numero sarà 2.23e-2, non 0.223e-3. – kennytm

+0

... e ovviamente intendo 2.23e + 2, non 2.23e-2. Suppongo che sia perché OP il '3' è più facile da notare rispetto a' -'. – kennytm

risposta

-4

Infine lo faccio a mano:

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

divisione successiva !? vedi risposta sotto – ErstwhileIII

+5

Le risposte possono essere "sotto", "sopra", o semplicemente dovunque in base a molti fattori, per esempio come li ordinate (più attivi, più vecchi, più votati). Se è necessario fare riferimento ad un'altra risposta, collegarla ad essa (fare clic su "condividi" per ottenere un permalink alla risposta) – Grodriguez

+1

oh no no no no !! –

21

Da Display numbers in scientific notation. (Copia/incolla perché la pagina sembra avere problemi)


È possibile visualizzare i numeri in notazione scientifica usando java.text pacchetto. Specificamente la classe DecimalFormat nel pacchetto java.text può essere utilizzata per questo scopo.

L'esempio seguente mostra come eseguire questa operazione:

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

* "Copia/incolla perché la pagina sembra avere problemi" * Anche perché SO dovrebbe stare in piedi da solo, nel caso in cui i riferimenti esterni si spostino, vai via, ecc. –

+2

è abbastanza vero, tuttavia di solito sono solo c/p le parti veramente pertinenti e quindi collegamento all'origine originale per informazioni più dettagliate. In questo caso, la fonte originale non funziona bene, quindi inserisco il tutto qui. –

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

risultati in

2.235e+02 

che è la più vicina. più

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

+1

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

+1

Spiegare cosa significa "% 6.3e". Posso dedurre che. 3e significa che ci sono solo tre cifre dopo il. ma cosa significa il 6? –

+1

@DonLarynx significa che ci sono un massimo di 6 cifre significative nel risultato. Per maggiori dettagli controlla il link alla sintassi per il formattatore. –

-1

Ecco un filo implementazione sicura:

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

Questo non è thread-safe; ogni thread deve avere il proprio formattatore. Il wrapping di un'istanza condivisa in un 'AtomicReference <>' non raggiunge alcun risultato. È necessario usare 'ThreadLocal' o creare un nuovo formattatore ogni volta che viene chiamato il metodo' format() '. –

9

Questa risposta farà risparmiare tempo per le persone + 40k che googling "notazione scientifica java".

Cosa significa Y in %X.YE?

Il numero tra il . e E è il numero di cifre decimali (non le cifre significative).

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

Il metodo String.format richiede di specificare il numero di cifre decimali per arrotondare a. Se è necessario preservare l'esatto significato del numero originale, sarà necessaria una soluzione diversa.

Cosa significa X in %X.YE?

Il numero tra il % e . è il numero minimo di caratteri stringa occuperà. (questo numero non è necessario, come indicato sopra la stringa si riempirà automaticamente se si lascia fuori)

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 
Problemi correlati