Este problema está me matando. Como um arredondamento para um número UP em Python?
Eu tentei arredondar (número), mas arredondar o número para baixo. Exemplo:
round(2.3) = 2.0 and not 3, what I would like
O que eu tentei int (número + 0,5), mas arredondar o número novamente! Exemplo:
int(2.3 + .5) = 2
Então tentei a rodada (número + 0,5), mas não funcionaria em casos extremos. Exemplo:
WAIT! THIS WORKED!
Por favor informar.
python
floating-point
integer
rounding
python-2.x
bodacydo
fonte
fonte
round(number + .5)
não funciona se o número for inteiro.round(3+.5) == 4
, quando você realmente quiser3
.Respostas:
O ceil função (teto):
fonte
int(math.ceil(363))
math.ceil
retorna um objeto inteiro real, não apenas um objeto flutuante com valor inteiro.10000000 * 0.00136 = 13600.000000000002
ceil pode aumentar muitomath.ceil(10000000 * 0.00136) = 13601.0
Sei que essa resposta é para uma pergunta há algum tempo, mas se você não deseja importar matemática e deseja arredondar, isso funciona para mim.
A primeira parte se torna 4 e a segunda parte é avaliada como "True" se houver um restante, que além disso True = 1; False = 0. Portanto, se não houver resto, ele permanecerá o mesmo número inteiro, mas se houver um restante, ele adicionará 1.
fonte
//
para divisão inteira, então isso se torna21 // 5 + (21 % 5 > 0)
.float
é necessário s. Agradável.Problema interessante sobre o Python 2.x a ser lembrado:
O problema é que dividir duas entradas em python produz outra int e isso é truncado antes da chamada do teto. Você precisa transformar um valor em um valor flutuante (ou convertido) para obter um resultado correto.
Em javascript, exatamente o mesmo código produz um resultado diferente:
fonte
Se estiver trabalhando com números inteiros, uma maneira de arredondar para cima é aproveitar o fato de
//
arredondamentos: basta fazer a divisão no número negativo e negar a resposta. Nenhuma importação, ponto flutuante ou condicional necessário.Por exemplo:
fonte
(num + den - 1) // den
, o que é bom paraint
entradas com denominadores positivos, mas falha se mesmo uma única não integralfloat
estiver envolvida (numerador ou denominador); isso é mais mágico, mas funciona paraint
s efloat
s. Para numeradores pequenos, também é mais rápido (no CPython 3.7.2), embora, estranhamente, quando apenas o numerador é grande o suficiente para que a matemática baseada em array seja necessária, sua abordagem é mais lenta; Não está claro por que isso ocorre, uma vez que o trabalho de divisão deve ser semelhante e duas negações unárias devem ser mais baratas que adição + subtração.Você também pode gostar de numpy:
Não estou dizendo que é melhor que matemática, mas se você já estava usando o numpy para outros fins, pode manter seu código consistente.
Enfim, apenas um detalhe que me deparei. Eu uso muito o numpy e fiquei surpreso por não ter sido mencionado, mas é claro que a resposta aceita funciona perfeitamente bem.
fonte
Use
math.ceil
para arredondar para cima:NOTA : A entrada deve ser flutuante.
Se você precisar de um número inteiro, ligue
int
para convertê-lo:Entre, use
math.floor
para arredondar para baixo eround
para o número inteiro mais próximo.fonte
ceil()
vai cuidar disso internamenteA sintaxe pode não ser tão pitônica quanto se possa gostar, mas é uma biblioteca poderosa.
https://docs.python.org/2/library/decimal.html
fonte
Estou surpreso que ninguém sugeriu
para divisão inteira com arredondamento para cima. Costumava ser o caminho comum para C / C ++ / CUDA (cf.
divup
)fonte
1
vez de subtraí-lo ou virar os sinais do numerador e do denominador antes de realizar a matemática.O valor arredondado Shure deve ser flutuante
mas
fonte
Tente o seguinte:
fonte
((int(a) - a) != 0)
expressão retorna1
sempre quea
precisar ser arredondada. Você pode expandir sua resposta e explicar como isso funciona.Esta função não requer módulos.
fonte
3
, então seria arredondar para4
o que pode ou não ser o que alguém querAs respostas acima estão corretas, no entanto, importar o
math
módulo apenas para essa função geralmente parece um pouco exagero para mim. Felizmente, há outra maneira de fazer isso:True
eFalse
são interpretados como1
e0
em uma declaração envolvendo números em python.g.is_interger()
traduz basicamente parag.has_no_decimal()
oug == int(g)
. Assim, a última declaração em Inglês lêround g down and add one if g has decimal
.fonte
int(g) + (g % 1 > 0)
em vez ;-)from math import ceil
parece resolver a importação de todo o módulo de matemática :)import math
em termos do que acontece nos bastidores. Apenas elimina todos os símbolos, excetoceil
.Sem importar matemática // usando o ambiente básico:
a) método / método de classe
b) lambda:
fonte
Para quem deseja arredondar
a / b
e obter um número inteiro:Outra variante que usa divisão inteira é
fonte
Caso alguém esteja procurando arredondar para uma casa decimal específica:
fonte
Estou surpreso por não ter visto essa resposta ainda
round(x + 0.4999)
, então vou anotá-la. Observe que isso funciona com qualquer versão do Python. As alterações feitas no esquema de arredondamento do Python tornaram as coisas difíceis. Veja este post .Sem importar, eu uso:
Por que isso funciona
Dos documentos
Portanto, 2,5 é arredondado para 2 e 3,5 é arredondado para 4. Se esse não fosse o caso, o arredondamento poderia ser feito adicionando 0,5, mas queremos evitar chegar ao ponto intermediário. Portanto, se você adicionar 0,4999, você se aproximará, mas com margem suficiente para ser arredondado para o que você normalmente esperaria. Obviamente, isso falhará se o
x + 0.4999
for igual a[n].5000
, mas isso é improvável.fonte
math.ceil()
?Without importing I use:
. Eu também mencionei que falhará se ox + 0.4999
for igual a[n].5000
.math
módulomath.ceil()
está na biblioteca padrão, disponível em todos os lugares para todos os fins práticos, sem a instalação de itens extras. E com relação à sua menção de quando falha, isso está incompleto em sua resposta, pois falha por um intervalo inteiro, não apenas por um único ponto. Tecnicamente, você pode argumentar que está correto, como diz se, e não se , mas isso causará a impressão no leitor casual de que é menos provável do que realmente é.Para fazer isso sem qualquer importação:
fonte
Eu sei que isso já faz um bom tempo, mas achei uma resposta bastante interessante, então aqui vai:
Isso corrige os casos de arestas e funciona para números positivos e negativos e não requer nenhuma importação de função
Felicidades
fonte
-round(-x-0.3) = x
quando você opera 4500/1000 em python, o resultado será 4, porque, para o python padrão, asume como número inteiro, logicamente: 4500/1000 = 4.5 -> int (4.5) = 4 e o teto de 4 obviamente é 4
usando 4500 / 1000.0, o resultado será 4,5 e o teto de 4,5 -> 5
Usando javascript, você receberá 4,5 como resultado de 4500/1000, porque o javascript assume apenas o resultado como "tipo numérico" e retorna um resultado diretamente como float
Boa sorte!!
fonte
/
sempre resulta em uma flutuação, assim4500/1000
como sempre é 4.5.Se você não deseja importar nada, sempre pode escrever sua própria função simples como:
def RoundUP(num): if num== int(num): return num return int(num + 1)
fonte
Você pode usar a disposição do piso e adicionar 1 a ela. 2,3 // 2 + 1
fonte
ceil()
, em vez de estranhamente fazendo o oposto e, em seguida, compensandofrom math import ceil; assert 4 // 2 + 1 == ceil(4 / 2)
Eu acho que você está confundindo os mecanismos de trabalho entre
int()
eround()
.int()
sempre trunca os números decimais se um número flutuante for fornecido; enquanto queround()
, no caso de2.5
onde2
e3
ambos estão a uma distância igual2.5
, o Python retorna o que estiver mais distante do ponto 0.fonte
2.3
é transformado3
, o que acontece em nenhum dos seus exemplos.Minha parte
Eu testei
print(-(-101 // 5)) = 21
dado o exemplo acima.Agora, para arredondar para cima:
Eu não posso usar,
**
então eu espalhei a multiplicação para divisão:fonte
Eu sou basicamente iniciante no Python, mas se você está apenas tentando arredondar em vez de diminuir, por que não:
fonte
round(integer + 0.5)
Isto é o que costumo fazer