Como o título sugere, quero pegar um número de ponto flutuante e arredondá-lo para o número inteiro mais próximo. No entanto, se não for um todo, SEMPRE quero arredondar a variável, independentemente de quão próxima ela esteja do próximo número inteiro acima. Existe uma maneira de fazer isso?
python
floating-point
integer
rounding
Anthony Perez
fonte
fonte
Respostas:
Simples
irá funcionar também.
fonte
int(-23.3) == 23
Um destes deve funcionar:
fonte
math.trunc
é um número inteiro, enquanto a saída demath.floor
é um número flutuante.type(math.floor(1.51)) -> int
e atype(math.trunc(1.51)) -> int
partir depython 3.6.0
O
//
operador retorna o piso da divisão. Como dividir por 1 não altera seu número, isso é equivalente ao piso, mas não é necessária nenhuma importação. Notas:fonte
int(-1.1) == -1
embora,-1.1//1 == -2.0
no entantodecimal.Decimal('-1.1')//1 == decimal.Decimal('-1')
(conforme documentado, a reivindicação 2 não seja verdadeiradecimal
), confiar em como o//
comportamento não é totalmente estável, ainda hoje.Para obter resultado de ponto flutuante, basta usar:
Também funciona para números negativos.
fonte
Eu acho que você precisa de uma função de andar:
math.floor (x)
fonte
muitas pessoas dizem usar
int(x)
, e isso funciona bem na maioria dos casos, mas há um pequeno problema. Se o resultado do OP for:vai arredondar para
após o dia 16 de setembro, ele será arredondado. Isso não é grande coisa, se você tiver certeza de que nunca encontrará algo assim. Mas é algo a ter em mente.
fonte
1.9999999999999999
na verdade é igual a2.0
na representação float64 interna. I. e. ele já é arredondado assim que é analisado em um flutuador, pois um flutuador de 64 bits não pode representar tantos dígitos significativos. Você pode verificar isso com a avaliação1.9999999999999999 == 2.0
. E se você suspeitar que a operação igual faz algum arredondamento em flutuadores, você pode comparar a representação binária comstruct.pack("d", 1.9999999999999999) == struct.pack("d", 2.0)
, que também é igual.int()
. O valor já é de 2,0 e vai convertê-lo em felizmente 2.int()
, apenas tem a ver com o uso inadequado defloat
, como1.9999999999999999
é arredondado para o2.0
tempo de compilação (enquantoint()
é chamado no tempo de execução). Se você usar o tipo de dados correto para a variável, tudo funciona como esperado:int(decimal.Decimal('1.9999999999999999999999999999999999999999999999999999999'))
dá1
Se você não deseja importar matemática, pode usar:
int(round(x))
Aqui está uma documentação:
fonte
round
já foi discutido e rejeitado como resposta quando essa pergunta foi feita há um ano. OP quermath.floor
.Se você trabalha com numpy, pode usar a seguinte solução, que também funciona com números negativos (também funciona com matrizes)
Eu acho que também funcionará se você apenas usar o
math
módulo em vez donumpy
módulo.fonte
Não sei se você resolveu isso, mas eu apenas tropeço nessa questão. Se você quiser se livrar dos pontos decimais, use int (x) e ele eliminará todos os dígitos decimais. Não há necessidade de usar o círculo (x).
fonte
Apenas faça o arredondamento (x-0,5); isso sempre retornará o próximo valor inteiro arredondado para baixo do seu flutuador. Você também pode arredondar facilmente arredondando (x + 0,5)
fonte
Pode ser muito simples, mas você não poderia arredondar para menos de 1? Por exemplo:
fonte
integer
.Eu usei esse código em que você subtrai 0,5 do número e quando você o arredonda, é o número original arredondado para baixo.
fonte