2009-07-07 4 views
41

Ho una stringa nel formato: 'nn.nnnnn' in Python e mi piacerebbe convertirla in un numero intero.Converte una stringa in intero con decimale in Python

Conversione diretta fallisce:

>>> s = '23.45678' 
>>> i = int(s) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: '23.45678' 

posso convertirlo in un numero decimale utilizzando: ''

>>> from decimal import * 
>>> d = Decimal(s) 
>>> print d 
23.45678 

Potrei anche dividere, poi sottrarre decimale da zero, quindi aggiungere quello al numero intero ... schifo.

Ma preferirei averlo come int, senza conversioni o manovre non necessarie.

+10

Matt, 23.45678 non è un numero intero. Se vuoi che Python converta una stringa in un intero, assicurati di dargli un numero intero. Le discussioni possono essere fatte in entrambi i modi su ciò che è la "giusta" cosa, e alla fine qualcuno sarà infelice. – Christopher

risposta

88

Che ne dici di questo?

>>> s = '23.45678' 
>>> int(float(s)) 
23 

Oppure ...

>>> int(Decimal(s)) 
23 

Oppure ...

>>> int(s.split('.')[0]) 
23 

dubito che sta per arrivare molto più semplice di quello, ho paura. Accettalo e vai avanti.

+3

Ricordare di "import decimal" quindi usarlo come 'decimal.Decimal (5)' o fare 'da decimal import Decimal' e usarlo come' Decimal (5) '. Mi dimentico sempre. – teewuane

+0

Si noti il ​​tipo di arrotondamento che ogni opzione offre al valore. – Rapnar

1

Si potrebbe utilizzare:

s = '23.245678' 
i = int(float(s)) 
13

Che tipo di arrotondamento comportamento vuoi di più? Ti 2.67 di trasformare in 3, o 2. Se si desidera utilizzare l'arrotondamento, provate questo:

s = '234.67' 
i = int(round(float(s))) 

In caso contrario, basta fare:

s = '234.67' 
i = int(float(s)) 
2

"Convertire" ha senso solo quando si cambia da un tipo di dati a un altro senza perdita di fedeltà. Il numero rappresentato dalla stringa è un float e perderà la precisione dopo essere stato forzato in un int.

Si desidera arrotondare invece, probabilmente (spero che i numeri non rappresentino la valuta perché l'arrotondamento diventa molto più complicato).

round(float('23.45678')) 
3
>>> s = '23.45678' 
>>> int(float(s)) 
23 
>>> int(round(float(s))) 
23 
>>> s = '23.54678' 
>>> int(float(s)) 
23 
>>> int(round(float(s))) 
24 

Non si specifica se si desidera che l'arrotondamento o no ...

0
round(float("123.789")) 

vi darà un valore intero, ma un tipo float. Con la digitazione di Python, tuttavia, il tipo effettivo di solito non è molto rilevante. Questo arrotonderà anche il valore, che potresti non volere. Sostituisci 'round' con 'int' e lo avrai appena troncato e un int effettivo. In questo modo:

int(float("123.789")) 

Ma, di nuovo, il "tipo" effettivo di solito non è così importante.

1

L'espressione int(float(s)) menzionata da altri è la migliore se si desidera troncare il valore.Se si desidera arrotondare, utilizzare se l'algoritmo rotondo corrisponde a ciò che si desidera (vedere round documentation), altrimenti è necessario utilizzare Decimal e uno se gli algoritmi di arrotondamento.