2012-02-23 49 views
8

Per un'applicazione scientifica ho bisogno di generare numeri molto precisi, quindi devo stampare 15 cifre significative. Ci sono già domande su questo argomento qui, ma tutte riguardano troncando le cifre, non stampa più.Come posso stampare molte cifre significative in Python?

Mi sono reso conto che la funzione print converte l'input float in un 10 carattere string. Inoltre, sono venuto a conoscenza del modulo decimal, ma ciò non soddisfa le mie esigenze.

Quindi la domanda è: come posso stampare facilmente una quantità variabile di cifre significative dei miei galleggianti, dove devo visualizzare più di 10?

+0

tenere a mente che un 'float' non potrebbe in realtà essere in grado di rappresentare i valori che si sta utilizzando per la precisione hai bisogno, il che significa che i tuoi calcoli potrebbero essere terribilmente sbagliati. – geoffspear

+0

@Wooble [This] (http://stackoverflow.com/a/6163157/566644) la risposta molto bella approfondisce la domanda che stai sollevando. Vale la pena dare un'occhiata. –

+0

Ma non esiste un tipo di dati più preciso di float in Python, vero? – Ingo

risposta

12

è possibile utilizzare la stringa di formattazione operatore %:

In [3]: val = 1./3 

In [4]: print('%.15f' % val) 
0.333333333333333 

o str.format():

In [8]: print(str.format('{0:.15f}', val)) 
Out[8]: '0.333333333333333' 

Nel nuovo codice, il secondo è lo stile preferito, anche se il primo è ancora ampiamente utilizzato.

Per ulteriori informazioni, vedere documentation.

+6

'print ('{0: .15f}'. Format (val))' è anche un altro modo per farlo nel nuovo formato. – TyrantWave

+3

Si noti che questo non stampa 15 cifre _significant_, ma solo 15 cifre dopo il punto decimale. Per numeri molto grandi o molto piccoli, questo non ha molto senso. IMHO, usando '"% .15e "' potrebbe essere più ragionevole. –

3

Utilizzare questi due idiomi di stampa comuni per la formattazione. È una questione di gusto personale su cui è meglio.

value = 10/3   #gives a float of 3.33333..... 

print '%.15f' % value 
print str.format('{0:.15f}', value) 

Personalmente penso che il primo sia più compatto e il secondo più esplicito. Il formato ha più funzioni quando si lavora con più val.

8

Pensato che la domanda originale voleva formattare n cifre significative, non n punti decimali. Quindi potrebbe essere necessaria una funzione personalizzata fino a quando non saranno disponibili altri tipi di nativi predefiniti? per cui ti consigliamo qualcosa di simile:

def float_nsf(q,n): 
    """ 
    Truncate a float to n significant figures. May produce overflow in 
    very last decimal place when q < 1. This can be removed by an extra 
    formatted print. 
    Arguments: 
     q : a float 
     n : desired number of significant figures 
    Returns: 
    Float with only n s.f. and trailing zeros, but with a possible small overflow. 
    """ 
    sgn=npy.sign(q) 
    q=abs(q) 
    n=int(npy.log10(q/10.)) # Here you overwrite input n! 
    if q<1. : 
     val=q/(10**(n-1)) 
    else: 
     val=q/(10**n) 
    return sgn*int(val)*10.**n 
1

È possibile utilizzare questa funzione ho scritto, sembra funzionare bene ed è abbastanza semplice:

def nsf(num, n=1): 
    """n-Significant Figures""" 
    numstr = ("{0:.%ie}" % (n-1)).format(num) 
    return float(numstr) 
  1. It primi convertiti il numero a una stringa utilizzando la notazione esponenziale
  2. Quindi lo restituisce come galleggiante .

Alcuni test:

>>> a = 2./3 
>>> b = 1./3 
>>> c = 3141592 
>>> print(nsf(a)) 
0.7 
>>> print(nsf(a, 3)) 
0.667 
>>> print(nsf(-a, 3)) 
-0.667 
>>> print(nsf(b, 4)) 
0.3333 
>>> print(nsf(-b, 2)) 
-0.33 
>>> print(nsf(c, 5)) 
3141600.0 
>>> print(nsf(-c, 6)) 
-3141590.0 

Spero che questo ti aiuta;)

+0

Hmm, questo continuava a sputare numeri in notazione esponenziale. Forse perché li ho riconvertiti in stringhe più tardi ?, cioè str (float (...)) – DrMisha

Problemi correlati