2009-06-09 15 views
11

Jak można obciąć wejście jak 315.15321531321 Chcę obciąć wszystkie wartości po pozycji setnych więc staje 315.15Python przyciąć po setkach?

jak mam to zrobić?

+1

Możesz również zajrzeć na http://stackoverflow.com/questions/455612/python-limiting-floats-to-two-dimal-points/455634#455634 –

+0

Rex, podoba mi się odpowiedź na pytanie zacytowany tak bardzo, tylko go przegłosowałem; wykonałeś świetną robotę wyjaśniając połączenia między int, float i Decimal w Pythonie. –

Odpowiedz

13

String formatowanie pod Pythona 2.x powinien to zrobić dla Ciebie:

>>> print '%.2f' % 315.15321531321 
315.15 

Ogranicza to reprezentacja ciąg do zaledwie 2 miejsca po przecinku. Zauważ, że jeśli używasz round(315.153215, 2), będziesz skończyć z inną wartość pływaka, który jest naturalnie niedokładny (lub overprecise, w zależności jak na to spojrzeć):

>>> round(315.15321531321, 2) 
315.14999999999998 

Technicznie round() jest poprawne, ale to nie robi "t" obcina "wyniki zgodnie z żądaniem pod numerem 315.15. Dodatkowo, jeśli zaokrąglisz wartość równą 315.157, pojawi się coś bliższego 315.16 ... nie jesteś pewien, czy to masz na myśli przez "obcięcie".

+3

i dla Python3: format (315.153321, ".2f") – NicDumZ

+1

Co ciekawe wczytałem wczoraj, że Python 3.1rc1 wybiera teraz najkrótszą reprezentację napisów, która rozdziela się na tę samą liczbę zmiennoprzecinkową, więc twój drugi przykład z rundą() wypisze 315.15 zgodnie z oczekiwaniami: http://docs.python.org/dev/py3k/whatsnew/3.1.html#other-language-changes –

+0

Dziękuję, Greg - nie wiedziałem o tym. Dobre dodatkowe informacje; im więcej słyszę o py3k, tym bardziej nie mogę się doczekać, aby użyć go codziennie! –

2

Jeśli chcesz tylko do wyświetlania go skrócić, można użyć flagi "%f" formatowania:

value = 315.123123123 
print "Value is: %.2f" % value 

Jeśli chcesz naprawdę odciąć „dodatkowy” cyfry, zrobić coś takiego:

from math import trunc 
value = trunc(value*100)/100 
+0

Powinieneś pomnożyć przez 100 wewnątrz nawiasów i podzielić po obcięciu, w przeciwnym razie otrzymasz tylko 300 kopii. – Joey

+0

@Johannes: Masz absolutną rację ... – sth

+0

A potem jest wbudowana runda() ... – tzot

1

Wbudowana funkcja round():

>>> num = 315.1532153132 
>>> round(num, 2) 
3.1499999999999998 
1

masz s kilka opcji - możesz zaokrąglić liczbę za pomocą round(), jednak może to wprowadzić pewne niedokładności (na przykład 315.15 może zaokrąglić do 315.150000003). Jeśli chcesz po prostu skrócić wartość float podczas wyświetlania, możesz określić szerokość wyjścia za pomocą printf ("%. 2f", mynumber). Jest to prawdopodobnie lepsze rozwiązanie, ponieważ nie wiedząc więcej o konkretnej aplikacji, ogólnie dobrym pomysłem jest zachowanie całej długości liczby do obliczenia.

7

wygląda print „% .2f” ma zaokrąglenia, jak również. Oto kod Pythona, który uzupełnia i obcina

num = 315.15627 
print "rounded = %.2f" % num 
print "truncated = %.2f" % (int(num*100)/float(100)) 

rounded = 315.16 
truncated = 315.15 
0

Podczas pracy z Decimal typów i waluty, w przypadku gdy kwota musi być precyzyjny, oto co wymyśliłem do obcinania do centów (setnych):

amount = Decimal(long(amount * 100))/Decimal(100) 

Mała historia: Wypróbowałem quantize, ale raczej zaokrągla, niż ścina. I nie mogłem z czystym sumieniem używać drogich formaterów do czegoś tak prostego. I w końcu nie chciałem żadnych problemów z precyzją a la float, więc używam bardzo specyficznego castingu, który jest prawdopodobnie przesadą.

0

Może to pomoże:

a=315.15321531321 
a=a*100 
a=int(a) 
a=a/100.0 
print(a) 
315.15 

Objaśnienie: Jeśli chcesz zaokrąglić w drugiego miejsca po przecinku, a następnie należy:
1. pomnożyć liczbę przez 100; to daje 31515.321531321,
2. przekonwertować tę nową liczbę na liczbę całkowitą; int (31515.321531321) daje 31515,
3. podziel to przez 100,0; 31515/100.0,
4. i otrzymasz poprawną odpowiedź; 315.15

Ciesz się!

+0

Twoja odpowiedź na pewno warta trochę wyjaśnienia. Prosimy zapoznać się z http://stackoverflow.com/help/how-to-answer. –