2010-10-21 15 views
7

Ho un sacco di carri allegorici e voglio arrotondare loro fino al prossimo più alto multiplo di 10.come da arrotondare al posto più alto 10 di in python

Ad esempio:

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

ho solo bisogno per andare dalla gamma 0-100. Ho provato math.ceil() ma questo arrotonda solo al numero intero più vicino.

Grazie in anticipo.

risposta

12
from math import ceil 

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

Edit: va bene, ora che ho un distintivo immeritata "bella risposta" per questa risposta, penso che deve la comunità con una soluzione adeguata utilizzando il modulo decimal che non soffre di questi problemi :) Grazie a Jeff per averlo indicato. Quindi, una soluzione che utilizza decimal funziona come segue:

from decimal import Decimal, ROUND_UP 

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

Naturalmente il codice di cui sopra richiede x ad essere un numero intero, una stringa o un oggetto Decimal - carri non funziona come che sconfiggere l'intero scopo di utilizzare il modulo decimal.

È un peccato che Decimal.quantize non funzioni correttamente con i numeri più grandi di 1, sarebbe stato salvato il trucco di divisione-moltiplicazione.

+1

È necessario essere molto attenti con virgola mobile qui. Pensi che x sia 10.0, ma in realtà è 10.000 ... 000132 e ottieni una risposta che non ti aspetti. Potresti stare meglio con l'aritmetica fissa o decimale. –

+0

Grazie - il tuo commento ha suscitato la mia curiosità, quindi ho esteso la mia risposta con una variante che utilizza il modulo 'decimale'. –

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

Le risposte qui sono piene di pericoli. Ad esempio 11*1.1 - 2.1 = 10.0, giusto? Ma aspetta:

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

Si potrebbe provare questo

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

Ma la scelta del numero di cifre decimali per arrotondare a è davvero difficile in quanto è difficile prevedere come Floating rumore punto si accumula. Se è davvero importante farlo sempre tutto il tempo, allora è necessario utilizzare l'aritmetica fissa o decimale.

+0

Stranamente, 'str (11 * 1.1-2.1)' produce ''10 .0'', il che suggerisce un'altra soluzione, decisamente molto brutta:' int (ceil (float (str (x))/10)) * 10'. –

+0

Credo che i turni str() fluttuino a 10 punti. –

0

Se siete alla ricerca di un'altra soluzione che non comporta la divisione float, ecco uno che utilizza il modulo:

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

C'è probabilmente un modo per semplificare, ma ci si va.

Problemi correlati