A documentação da função round () indica que você passa um número para ele e as posições passam do decimal para o arredondamento. Assim, deve fazer o seguinte:
n = 5.59
round(n, 1) # 5.6
Mas, na verdade, a boa e velha estranheza de ponto flutuante aparece e você obtém:
5.5999999999999996
Para os fins da interface do usuário, eu preciso exibir 5.6
. Procurei na Internet e encontrei alguma documentação que depende da minha implementação do Python. Infelizmente, isso ocorre na minha máquina Windows dev e em cada servidor Linux que eu tentei. Veja aqui também .
Com exceção de criar minha própria biblioteca redonda, existe alguma maneira de contornar isso?
python
floating-point
rounding
Swilliams
fonte
fonte
round(5.55, 1) = 5.5
.Respostas:
Não posso ajudar na maneira como ele é armazenado, mas pelo menos a formatação funciona corretamente:
fonte
print '%.2f' % 655.665
, mas ele retorna655.66
, deve ser655.67
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_DOWN
# uso no arredondamento números flutuantesDecimal(str(655.665)).quantize(Decimal('1.11'), rounding=ROUND_HALF_UP)
# problemas e limitações em pontos flutuantesA formatação funciona corretamente, mesmo sem a necessidade de arredondar:
fonte
"{:.1f}".format(n)
'%.5f' % 0.988625
dá0.98862
Se você usar o módulo Decimal, poderá aproximar-se sem o uso da função 'round'. Aqui está o que eu tenho usado para arredondar, especialmente ao escrever aplicativos monetários:
Isso retornará um número decimal que é 16,20.
fonte
rounding='ROUND_UP'
NameError: global name 'ROUND_UP' is not defined
você precisa importar a sua função de arredondamento:from decimal import Decimal, ROUND_UP
. Outras funções de arredondamentoround(5.59, 1)
está funcionando bem. O problema é que o 5.6 não pode ser representado exatamente no ponto flutuante binário.Como Vinko diz, você pode usar a formatação de seqüência de caracteres para arredondar para exibição.
Python possui um módulo para aritmética decimal, se você precisar.
fonte
Você obtém '5.6' se obtiver, em
str(round(n, 1))
vez de apenasround(n, 1)
.fonte
Você pode alternar o tipo de dados para um número inteiro:
E, em seguida, exiba o número inserindo o separador decimal da localidade.
No entanto, a resposta de Jimmy é melhor.
fonte
A matemática de ponto flutuante é vulnerável a imprecisões leves, mas irritantes, de precisão. Se você pode trabalhar com um número inteiro ou ponto fixo, você terá precisão garantida.
fonte
Dê uma olhada no módulo Decimal
e
Decimal fornece o tipo de operações que facilitam a gravação de aplicativos que exigem operações de ponto flutuante e também precisam apresentar esses resultados em um formato legível por humanos, por exemplo, contabilidade.
fonte
imprima o otário.
fonte
É realmente um grande problema. Experimente este código:
Exibe 4,85. Então você faz:
e mostra 4.8. Você calcula manualmente a resposta exata é 4,85, mas se tentar:
você pode ver a verdade: o ponto flutuante é armazenado como a soma finita mais próxima de frações cujos denominadores são potências de dois.
fonte
Você pode usar o operador de formato de sequência
%
, semelhante ao sprintf.fonte
Works Perfect
fonte
Estou fazendo:
Nesse caso, primeiro arredondamos corretamente no nível da unidade e depois convertemos para número inteiro para evitar a impressão de um flutuador.
tão
Acho que essa resposta funciona melhor do que formatar a string e também faz mais sentido usar a função round.
fonte
Eu evitaria confiar
round()
nesse caso. Considerarirá produzir
que não é uma saída desejada se você precisar de arredondamentos sólidos para o número inteiro mais próximo. Para ignorar esse comportamento, vá com
math.ceil()
(oumath.floor()
se você deseja arredondar para baixo):saídas
Espero que ajude.
fonte
Código:
Resultado:
fonte
Aqui é onde vejo a rodada falhando. E se você quisesse arredondar esses 2 números para uma casa decimal? 23,45 23,55 Minha educação foi que, ao arredondar esses números, você deve obter: 23,4 23,6 a "regra" é que você deve arredondar para cima se o número anterior for ímpar, não arredondar para cima se o número anterior for par. A função round em python simplesmente trunca o 5.
fonte
O problema é apenas quando o último dígito é 5. Por exemplo. 0,045 é armazenado internamente como 0,044999999999999 ... Você pode simplesmente aumentar o último dígito para 6 e arredondar. Isso lhe dará os resultados desejados.
fonte
Outra opção potencial é:
fonte
A respeito:
fonte
epsilon = .000001
entãoround(1.0/5.0, 1) + epsilon
pegaria a representação precisa 0.2 e a tornaria 0.00001. Problemas igualmente ruins aconteceriam se o epsilon estivesse dentro da função round.