2010-10-21 11 views
7

Tengo un montón de flotadores y quiero redondear hacia arriba hasta la siguiente múltiplo de 10.cómo redondear al lugar más alto de 10 en pitón

Por ejemplo:

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

sólo necesito ir del rango 0-100. Intenté math.ceil() pero eso solo redondea al entero más cercano.

Gracias de antemano.

Respuesta

12
from math import ceil 

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

Editar: bien, ahora que tengo una insignia inmerecida "Nice respuesta" a esta respuesta, creo que le debe a la comunidad con una solución adecuada mediante el módulo decimal que no sufre de estos problemas :) Gracias a Jeff por señalar esto. Por lo tanto, una solución utilizando decimal funciona del siguiente modo:

from decimal import Decimal, ROUND_UP 

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

Por supuesto, el código anterior requiere x a ser un número entero, una cadena o un objeto Decimal - flotadores no funcionarán, ya que ello derrotar todo el propósito de utilizar el módulo decimal.

Es una pena que Decimal.quantize no funcione correctamente con números mayores que 1, habría guardado el truco de multiplicación de división.

+1

Debe tener mucho cuidado con el punto flotante aquí. Crees que x es 10.0, pero en realidad es 10.000 ... 000132 y obtienes una respuesta que no esperas. Puede que estés mejor con aritmética de punto fijo o decimal. –

+0

Gracias - tu comentario despertó mi curiosidad, así que extendí mi respuesta con una variante que usa el módulo 'decimal'. –

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

Las respuestas aquí están cargadas de peligros. Por ejemplo 11*1.1 - 2.1 = 10.0, ¿verdad? Pero espera:

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

Usted podría intentar esto

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

Pero elegir el número de decimales a redondear es muy difícil, ya que es difícil predecir cómo se acumula el ruido flotante punto. Si es realmente importante hacerlo bien todo el tiempo, entonces necesita usar aritmética de punto fijo o Decimal.

+0

Curiosamente, 'str (11 * 1.1-2.1)' produce ''10 .0'', lo que sugiere otra solución, ciertamente muy fea:' int (ceil (float (str (x))/10)) * 10'. –

+0

Creo que str() rounds flota en 10 lugares. –

0

Si usted está buscando otra solución que no implique la división de flotador, aquí hay uno que utiliza el módulo:

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

Probablemente hay alguna manera de simplificarlo, pero hay que ir.

Cuestiones relacionadas