Converti il ​​numero in virgola mobile in una certa precisione, quindi copia in stringa


144

Ho un numero in virgola mobile, diciamo 135.12345678910. Voglio concatenare quel valore a una stringa, ma voglio solo 135.123456789. Con la stampa, posso facilmente farlo facendo qualcosa del tipo:

print "%.9f" % numvar

con numvaressere il mio numero originale. C'è un modo semplice per farlo?


3
% lo fa esattamente -% non fa parte della funzione di stampa ma della stringa - vedi documenti Python
michael_s

Risposte:


177

Con Python <3 (es. 2.6 [vedi commenti] o 2.7), ci sono due modi per farlo.

# Option one
older_method_string = "%.9f" % numvar

# Option two
newer_method_string = "{:.9f}".format(numvar)

Tuttavia, per le versioni Python precedenti alla 3 (ad es. 3.2 o 3.3), si preferisce l' opzione due .

Per ulteriori informazioni sull'opzione due, suggerisco questo link sulla formattazione delle stringhe dalla documentazione di Python .

E per ulteriori informazioni sull'opzione 1, questo collegamento sarà sufficiente e contiene informazioni sui vari flag .

Python 3.6 (rilasciato ufficialmente nel dicembre del 2016), ha aggiunto la fstringa letterale, vedere qui ulteriori informazioni , che estende il str.formatmetodo (uso di parentesi graffe in modo tale da f"{numvar:.9f}"risolvere il problema originale), ovvero

# Option 3 (versions 3.6 and higher)
newest_method_string = f"{numvar:.9f}"

risolve il problema. Controlla la risposta di @Or-Duan per maggiori informazioni, ma questo metodo è veloce .


1
l'opzione due dovrebbe essere newer_method_string = "{:.9f}".format(numvar): annotare la richiesta :per separare il campo e la formattazione. Ho provato questo su 2.7.5 comunque.
Caltor,

1
Per python 2.6 l'opzione dovrebbe essere due newer_method_string = "{0:.9f}".format(numvar): notare lo 0 richiesto per field_name per questa versione precedente.
TT

56

Python 3.6

Solo per chiarire, è possibile utilizzare la formattazione f-string . Questo ha quasi la stessa sintassi del formatmetodo, ma lo rende un po 'più bello.

Esempio:

print(f'{numvar:.9f}')

Altre informazioni sulla nuova stringa f:

Ecco un diagramma dei tempi di esecuzione dei vari metodi testati (dall'ultimo link sopra):

tempi di esecuzione


52

Utilizzando round:

>>> numvar = 135.12345678910
>>> str(round(numvar, 9))
'135.123456789'

8

Non è la stampa che esegue la formattazione, è una proprietà delle stringhe, quindi puoi semplicemente usarla

newstring = "%.9f" % numvar

Oppure usa la nuova formattazione di stile. valueString = "{:. 9f}". format (numero)
Zaren

8

Nel caso in cui la precisione non sia nota fino al runtime, questa altra opzione di formattazione è utile:

>>> n = 9
>>> '%.*f' % (n, numvar)
'135.123456789'

3
Se invece si preferisce utilizzare .format-Metodo, nota che questo può essere fatto anche con argomenti di nidificazione in questo modo: '{:.{n}f}'.format(numvar,n=n).
nivk,

2

Per impostare la precisione con 9 cifre, ottenere:

print "%.9f" % numvar

Restituisce la precisione con 2 cifre:

print "%.2f" % numvar 

Restituisce la precisione con 2 cifre e il valore float convertito:

numvar = 4.2345
print float("%.2f" % numvar) 

-2

La strfunzione ha un bug. Si prega di provare quanto segue. Vedrai '0,196553' ma l'output corretto è '0,196554'. Perché il strvalore predefinito della funzione è ROUND_HALF_UP.

>>> value=0.196553500000 
>>> str("%f" % value).replace(".", ",")

2
Cosa succede con .vs. ,? E come è rilevante per la domanda di pauliwago?
Peter Mortensen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.