2009-07-07 26 views
41

Mam ciąg znaków w formacie: "nn.nnnnn" w języku Python, a ja chciałbym przekonwertować go na liczbę całkowitą.Konwertuj ciąg na liczbę całkowitą z dziesiętnym w języku Python

bezpośrednia konwersja nie powiedzie:

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

mogę przekonwertować go do postaci dziesiętnej za pomocą: „”

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

mogę również podzielić na, odejmujemy po przecinku od zera, a następnie dodać to do całej liczby ... fuj.

Ale wolałbym mieć to jako int, bez niepotrzebnych konwersji ani manewrów.

+10

Matt, 23,45678 nie jest liczbą całkowitą. Jeśli chcesz, aby Python konwertował ciąg na liczbę całkowitą, upewnij się, że nadajesz mu liczbę całkowitą. Można argumentować w dowolny sposób na temat "właściwej" rzeczy, aw końcu ktoś będzie nieszczęśliwy. – Christopher

Odpowiedz

88

Co z tym?

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

Albo ...

>>> int(Decimal(s)) 
23 

Albo ...

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

wątpię, to będzie się o wiele prostsze niż, że ja się boję. Po prostu to zaakceptuj i przejdź dalej.

+3

Pamiętaj, aby "importować znaki dziesiętne", a następnie użyj go jako "decimal.Decimal (5)" lub "from decimal import Decimal" i użyj go jako "Decimal (5)". Zawsze zapominam. – teewuane

+0

Powinieneś zwrócić uwagę na rodzaj zaokrąglania, który każda opcja oferuje do wartości. – Rapnar

1

Można użyć:

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

Jakie zaokrąglania zachowanie chcesz? Czy 2,67 przekształcić 3 lub 2. Jeśli chcesz użyć zaokrąglanie, spróbuj tego:

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

W przeciwnym razie po prostu zrobić:

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

„Convert” ma sens tylko przy zmianie z jeden typ danych do drugiego bez utraty wierności. Liczba reprezentowana przez ciąg jest zmiennoprzecinkową i straci precyzję, gdy zostanie wymuszona na int.

Chcesz zaokrąglić, prawdopodobnie (mam nadzieję, że liczby nie reprezentują waluty, ponieważ wtedy zaokrąglanie staje się dużo bardziej skomplikowane).

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 

Nie określić, czy chcesz, czy nie ... zaokrąglania

0
round(float("123.789")) 

daje wartość całkowitą, ale typu float. Jednak przy pisaniu w języku Python typowy typ zazwyczaj nie jest zbyt istotny. Spowoduje to również zaokrąglenie wartości, której możesz nie chcieć. Zamień "rundę" na "int", a otrzymasz go po prostu obciętego i rzeczywistą int. W ten sposób:

int(float("123.789")) 

Ale znowu, rzeczywisty "typ" zazwyczaj nie jest tak ważny.

1

Wyrażenie int(float(s)) wymieniane przez innych jest najlepsze, jeśli chcesz skrócić wartość.Jeśli chcesz zaokrąglić, używając , jeśli algorytm rundy pasuje do tego, co chcesz (patrz: round documentation), w przeciwnym razie powinieneś użyć Decimal i jednego, jeśli chodzi o algorytmy zaokrąglania.

Powiązane problemy