2010-10-21 13 views
7

Mam grono pływaków i chcę zaokrąglić je do następnego najwyższego wielokrotności 10.jak zaokrąglić do wyższego Umieścić 10 w Pythonie

Na przykład:

10.2 should be 20 
10.0 should be 10 
16.7 should be 20 
94.9 should be 100 

Muszę tylko to iść z zakresu 0-100. Próbowałem math.ceil(), ale to zaokrągla tylko do najbliższej liczby całkowitej.

Z góry dziękuję.

Odpowiedz

12
from math import ceil 

def ceil_to_tens(x): 
    return int(ceil(x/10.0)) * 10 

Edit: Dobra, teraz, że mam niezasłużoną „Nice odpowiedź” odznaki dla tej odpowiedzi, myślę, że zawdzięczam społeczność z właściwego rozwiązania z wykorzystaniem modułu decimal że nie cierpią z tych problemów :) Dzięki Jeffowi za wskazanie tego. Więc rozwiązanie używając decimal działa następująco:

from decimal import Decimal, ROUND_UP 

def ceil_to_tens_decimal(x): 
    return (Decimal(x)/10).quantize(1, rounding=ROUND_UP) * 10 

Oczywiście powyższy kod wymaga x być liczbą całkowitą, łańcuch lub Decimal obiektu - pływaki nie zadziała gdyż byłoby pokonać cały cel korzystania moduł decimal.

Szkoda, że ​​Decimal.quantize nie działa poprawnie z liczbami większymi niż 1, to zapisałaby sztuczkę dzielenia-mnożenia.

+1

Musisz tu być naprawdę ostrożny przy pomocy zmiennoprzecinkowego. Myślisz, że x wynosi 10.0, ale tak naprawdę to 10.000 ... 000132, a otrzymasz odpowiedź, której się nie spodziewasz. Lepiej być z arytmetyką o stałym punkcie lub dziesiętnym. –

+0

Dzięki - Twoja uwaga wzbudziła moją ciekawość, dlatego przedłużyłam swoją odpowiedź wariantem wykorzystującym moduł "dziesiętny". –

3
>>> x = 16.7 
>>> int(10 * math.ceil(x/10.0)) 
1

Odpowiedzi tutaj są obarczone ryzykiem. Na przykład 11*1.1 - 2.1 = 10.0, prawda? Ale czekać:

>>> x = 11*1.1 - 2.1 
>>> int(ceil(x/10.0)) * 10 
20 
>>> x 
10.000000000000002 
>>> 

można spróbować tej

int(ceil(round(x, 12)/10.0)) * 10 

ale wybierając liczbę miejsc po przecinku zaokrąglić do jest naprawdę trudne, jak trudno jest przewidzieć, jak Pływający gromadzi punkt hałas. Jeśli jest to naprawdę ważne, aby uzyskać to prawo przez cały czas, musisz użyć arytmetycznych punktów stałych lub dziesiętnych.

+0

O dziwo, 'str (11 * 1.1-2.1)' daje ''10 .0'', co sugeruje inne, wprawdzie bardzo brzydkie rozwiązanie:' int (ceil (float (str (x))/10)) * 10'. –

+0

Wierzę, że rundy str() są przenoszone do 10 miejsc. –

0

Jeśli szukasz innego rozwiązania, które nie wiąże się podział pływaka, oto ten, który wykorzystuje moduł:

def ceil_to_tens_mod(x): 
    tmp = int(ceil(x)) 
    mod10 = tmp % 10 
    return tmp - mod10 + (10 if mod10 else 0) 

Jest chyba jakiś sposób, żeby to uproszczenie, ale tam.

Powiązane problemy