2011-01-30 18 views
8

chcę przekonwertować 1/2 w python tak, że kiedy mówię print x (gdzie x = 1/2) zwraca 0.5Python Konwersja ułamek na dziesiętne

szukam najbardziej podstawowym sposobem osiągnięcia tego celu , bez użycia żadnych funkcji podziału, pętli lub map

Próbowałem float (1/2), ale dostaję 0 ... czy ktoś może mi wyjaśnić, dlaczego i jak to naprawić?

Czy można to zrobić bez modyfikowania zmiennej x = 1/2 ??

Dzięki

+0

można opracować bardziej co masz na myśli przez 'bez modyfikacji zmiennej x = 1/2'? – eat

+0

Czy jest to podchwytliwe pytanie w ramach zajęć, które bierzesz? Jeśli tak, zaznacz to jako [zadanie domowe]. –

Odpowiedz

23

w python 3.x Dowolna dywizja zwraca wartość zmiennoprzecinkową;

>>> 1/2 
0.5 

aby osiągnąć w Pythonie 2.x, trzeba wymusić konwersję float:

>>> 1.0/2 
0.5 

lub importować podział z "przyszłości"

>>> from __future__ import division 
>>> 1/2 
0.5 

Dodatkowy: nie ma wbudowanego typu ułamka, ale w oficjalnej bibliotece znajduje się:

>>> from fractions import Fraction 
>>> a = Fraction(1, 2) #or Fraction('1/2') 
>>> a 
Fraction(1, 2) 
>>> print a 
1/2 
>>> float(a) 
0.5 

i tak dalej ...

+4

korekta - w Python3, '/' robi podziałkę zmiennoprzecinkową, a '//' zawiera int; gdzie w Python2, zależnie od argumentów, '/' może być dzieleniem zmiennoprzecinkowym (jeśli przynajmniej jeden argument jest zmiennoprzecinkowy) lub int (jeśli wszystkie argumenty są int) –

7

Pewnie przy użyciu Python 2. Można „naprawić” podział za pomocą:

from __future__ import division 

na początku skryptu (przed innymi importu). Domyślnie w Pythonie 2 operator / wykonuje dzielenie całkowite przy użyciu operandów całkowitych, co powoduje odrzucenie ułamkowych części wyniku.

Zostało to zmienione w Pythonie 3, więc / jest zawsze dzieleniem zmiennoprzecinkowym. Nowy operator // wykonuje dzielenie liczb całkowitych.

+0

Nie mogę wstawić tego do funkcji ... daje mi błąd mówiąc, że wiersz musi być umieszczony na początku pliku .. – Kartik

+0

Zgadza się.Innym sposobem wymuszenia podziałów zmiennoprzecinkowych jest użycie co najmniej jednego argumentu zmiennoprzecinkowego. Więc spróbuj '1/2.0' lub' 1/float (2) '. –

+0

Wiem w ten sposób, ale problem polega na tym, że nie mogę zmodyfikować wejścia .. nie mogę zmienić x = "1/2". Wszystko, co mogę zrobić, to zastosować do niego różne funkcje, aby uzyskać 0.5 .. Czy to możliwe? droga? – Kartik

6

Można także wymusić podział zmiennoprzecinkowy, określając liczbę dziesiętną lub liczbę mnożąc przez 1,0. Na przykład (od wewnątrz interpretera Pythona):

>>> print 1/2 
0 
>>> print 1./2 
0.5 
>>> x = 1/2 
>>> print x 
0 
>>> x = 1./2 
>>> print x 
0.5 
>>> x = 1.0 * 1/2 
>>> print x 
0.5 

EDIT: Wygląda na to, że został pobity na stemplu w czasie zajęło wpisać moją odpowiedź :)

3

Nie ma ilość 1/2 wszędzie. Python nie reprezentuje liczb wymiernych z wbudowanym typem - po prostu liczby całkowite i liczby zmiennoprzecinkowe. 1 jest dzielone przez 2 - zgodnie z regułami dzielenia całkowitoliczbowego - co daje 0. float(0) jest 0.

3

Jeśli wejście jest ciągiem znaków, wtedy można użyć frakcji bezpośrednio na wejściu:

from fractions import Fraction 

x='1/2' 
x=Fraction(x) #change the type of x from string to Fraction 
x=float(x)  #change the type of x from Fraction to float 
print x