2009-07-07 8 views
41

У меня есть строка в формате: 'nn.nnnnn' в Python, и я хотел бы преобразовать ее в целое число.Преобразование строки в целое число с десятичной точкой в ​​Python

Прямое преобразование не может быть:

>>> 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' 

я могу преобразовать его в десятичное с помощью: «»

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

Я мог бы также разделить на, а затем вычесть десятичные от нуля, а затем добавить что для целого числа ... yuck.

Но я бы предпочел, чтобы это было как int, без ненужных преобразований типов или маневрирования.

+10

Matt, 23.45678 не является целым числом. Если вы хотите, чтобы Python преобразовывал строку в целое число, убедитесь, что вы дали ей целое число. Аргументы могут быть сделаны в любом случае о том, что такое «правильная», и, в конце концов, кто-то будет недоволен. – Christopher

ответ

88

Как насчет этого?

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

Или ...

>>> int(Decimal(s)) 
23 

Или ...

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

Я сомневаюсь, что это будет получить гораздо проще, чем это, я боюсь. Просто примите его и продолжайте.

+3

Помните «import decimal», затем используйте его как 'decimal.Decimal (5)' или do 'из десятичного импорта Decimal' и используйте его как' Decimal (5) '. Я всегда забываю. – teewuane

+0

Следует отметить, что тип округления каждой опции предлагает значение. – Rapnar

1

Вы могли бы использовать:

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

Какое округление поведения вы хотите? Есть ли 2,67 превратиться в 3 или 2. Если вы хотите использовать округление, попробуйте следующее:

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

В противном случае, просто сделать:

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

«Преобразование» имеет смысл только при переходе от один тип данных в другой без потери точности. Число, представленное строкой, является float и будет терять точность при принуждении к int.

Вместо этого вы хотите округлить, возможно (я надеюсь, что цифры не представляют собой валюту, потому что округление становится намного сложнее).

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 

Вы не указать, если вы хотите округление или нет ...

0
round(float("123.789")) 

даст вам целое значение, а тип с плавающей точкой. Тем не менее, при наборе утинов Python фактический тип обычно не очень уместен. Это также будет округлять значение, которое вы, возможно, не захотите. Замените 'round' на 'int', и вы получите его просто усеченным и фактическим int. Например:

int(float("123.789")) 

Но, опять же, фактический тип обычно не так важен.

1

Выражение int(float(s)), упомянутое другими, является лучшим, если вы хотите усечь значение.Если вы хотите округлить, используя , если круглый алгоритм соответствует тому, что вы хотите (см. round documentation), в противном случае вы должны использовать Decimal и один, если его алгоритмы округления.