2009-11-16 9 views
9

riscontrano difficoltà a convertire un galleggiante per stringa, nel modo seguente:Convertire float a stringa con taglio a zero decimali afer punto in Python

20.02 --> 20.02 
20.016 --> 20.02 
20.0 --> 20 

Sembra che il formato %g è la migliore per questo, ma sono ottenendo risultati strani:

In [30]: "%.2g" % 20.03 
Out[30]: '20' 

In [31]: "%.2g" % 20.1 
Out[31]: '20' 

In [32]: "%.2g" % 20.3 
Out[32]: '20' 

In [33]: "%.2g" % 1.2 
Out[33]: '1.2' 

In [34]: "%.2g" % 1.0 
Out[34]: '1' 

In [35]: "%.2g" % 2.0 
Out[35]: '2' 

In [36]: "%.2g" % 2.2 
Out[36]: '2.2' 

In [37]: "%.2g" % 2.25 
Out[37]: '2.2' 

In [38]: "%.2g" % 2.26 
Out[38]: '2.3' 

In [39]: "%.3g" % 2.26 
Out[39]: '2.26' 

In [40]: "%.3g" % 2.25 
Out[40]: '2.25' 

In [41]: "%.3g" % 20.02 
Out[41]: '20' 

In [42]: "%.3g" % 20.016 
Out[42]: '20' 

In [43]: "%.20g" % 20.016 
Out[43]: '20.015999999999998238' 

l'unica soluzione che conosco in questo momento sta controllando se il numero è un int e applicando %d invece di %f formattazione - questo è troppo complicato, io pensare.

Qualcuno sa perché le cose di cui sopra stanno scendendo? Come farlo in un modo più semplice?

Grazie.

+1

che Avatar probabilmente non durerà. –

+0

@Jed, sembra che sia durato almeno un anno ormai;) –

risposta

10

Utilizzando %f di formato:

('%.2f' % (value,)).rstrip('0').rstrip('.') 

Utilizzando round() funzione:

str(round(value)).rstrip('0').rstrip('.') 
1

uso funzione built-in round

1

provare qualcosa di un po 'meno di 20 cifre. Se usi 20 cifre, ti darà la rappresentazione a 20 cifre del valore in virgola mobile, che potrebbe sembrare un po 'strano.

2

Non sono sicuro di cosa stia esattamente trovando complicato qui - stai ottenendo esattamente i risultati specificati, ad es. here. Ad esempio:

In [32]: "%.2g" % 20.3 
Out[32]: '20' 

In [33]: "%.2g" % 1.2 
Out[33]: '1.2' 

In ogni caso, è stato chiesto a 2 cifre si visualizzeranno in tutto, e questo è ciò che sta accadendo (entrambe le cifre vengono prima del punto finale in un caso, uno prima e uno dopo nell'altro caso , ma questa è una conseguenza ovvia delle rispettive grandezze dei numeri).

Quando si richiedono 20 cifre, vengono mostrate 20 cifre - la maggior parte non ha senso (un punto di virgola mobile IEEE a precisione doppia è valido solo per circa 16 cifre di precisione), quindi è più ragionevole chiedere di meno. Ovviamente sai che i float sono rappresentati in binario, come spiegato here, giusto? Utilizzare decimal (molto più lentamente, ovviamente, dal momento che ciò che l'hardware del computer fornisce è il punto mobile binario, la versione decimale deve essere sintetizzata nel software) è ciò di cui si ha bisogno è rappresentato da galleggianti decimali (ad es. Per calcoli monetari).

5

uso tutto l'insieme %g - si vuole al massimo 2 cifre mostrato, così rotondo a due cifre, quindi utilizzare %g stamparlo più breve possibile:

>>> "%g" % round(20.016, 2) 
'20.02' 
>>> "%g" % round(20, 2) 
'20' 
1

È possibile utilizzare .format anziché %.

>>> '{:.2f}'.format(3.0101) 
'3.01' 
>>> type('{:.2f}'.format(3.0101)) 
str 

C'è molta più roba che non è possibile utilizzare % ma può essere fatto utilizzando .format.

Per ulteriori informazioni di formattazione, un'occhiata a pyformat

Problemi correlati