Existe uma função interna que pode ser arredondada da seguinte maneira?
10 -> 10
12 -> 10
13 -> 15
14 -> 15
16 -> 15
18 -> 20
Não conheço uma função padrão no Python, mas isso funciona para mim:
def myround(x, base=5):
return int(base * round(float(x)/base))
def myround(x, base=5):
return base * round(x/base)
É fácil ver por que o que foi dito acima funciona. Você deseja garantir que seu número dividido por 5 seja um número inteiro, arredondado corretamente. Então, primeiro fazemos exatamente isso ( round(float(x)/5)
onde float
é necessário apenas no Python2) e, depois que dividimos por 5, multiplicamos por 5 também. A conversão final para int
é porque round()
retorna um valor de ponto flutuante no Python 2.
Tornei a função mais genérica, fornecendo um base
parâmetro, assumindo o padrão 5.
x // base * base
floor()
eceil()
nãobase * floor(x/base)
math.floor
emath.ceil
não permita o uso com uma base personalizada, portanto, a preferência é irrelevante.Para arredondar para valores não inteiros, como 0,05:
Achei isso útil, pois eu poderia apenas fazer uma pesquisa e substituir no meu código para alterar "round (" para "myround (", sem precisar alterar os valores dos parâmetros).
fonte
def my_round(x, prec=2, base=0.05): return (base * (np.array(x) / base).round()).round(prec)
qual aceita matrizes numpy também.É apenas uma questão de escala
fonte
Remover o 'resto' funcionaria:
Se o valor já for um número inteiro:
Como uma função:
fonte
fonte
round (x [, n]): os valores são arredondados para o múltiplo mais próximo de 10 para a potência menos n. Então, se n é negativo ...
Como 10 = 5 * 2, você pode usar a divisão inteira e a multiplicação com 2, em vez da divisão e multiplicação flutuante com 5.0. Não que isso importe muito, a menos que você goste de mudar um pouco
fonte
Desculpe, eu queria comentar a resposta de Alok Singhai, mas isso não me deixa devido à falta de reputação = /
De qualquer forma, podemos generalizar mais um passo e prosseguir:
Isso nos permite usar bases não inteiras, como
.25
qualquer outra base fracionária.fonte
Versão modificada do divround :-)
fonte
Usar:
Ele não usa multiplicação e não converterá de / para carros alegóricos.
Arredondando para o múltiplo mais próximo de 10:
Como você pode ver, ele funciona para números negativos e positivos. Os laços (por exemplo, -15 e 15) sempre serão arredondados para cima.
Um exemplo semelhante que arredonda para o múltiplo mais próximo de 5, demonstrando que ele também se comporta conforme o esperado para uma "base" diferente:
fonte
Caso alguém precise de "arredondamentos financeiros" (0,5 arredondamentos sempre acima):
Conforme a documentação, outras opções de arredondamento são:
Por padrão, o Python usa ROUND_HALF_EVEN, pois possui algumas vantagens estatísticas (os resultados arredondados não são tendenciosos).
fonte
Para números inteiros e com Python 3:
Produção:
fonte
Que tal isso:
fonte
Próximo múltiplo de 5
Considere que 51 precisa ser convertido para 55:
fonte
Aqui está o meu código C. Se eu entendi direito, deveria ser algo assim;
e isso também arredonda para o múltiplo mais próximo de 5, em vez de apenas arredondar para cima;
fonte
Outra maneira de fazer isso (sem operadores explícitos de multiplicação ou divisão):
fonte
Você pode "enganar" o
int()
arredondamento em vez de arredondar para baixo, adicionando0.5
ao número para o qual você passaint()
.fonte