Eu estava apenas relendo o que há de novo no Python 3.0 e ele afirma:
A estratégia de arredondamento da função round () e o tipo de retorno foram alterados. Os casos exatos na metade agora são arredondados para o resultado par mais próximo, em vez de se afastarem de zero. (Por exemplo, a rodada (2,5) agora retorna 2 em vez de 3.)
e a documentação para a rodada :
Para os tipos internos que suportam round (), os valores são arredondados para o múltiplo mais próximo de 10 para a potência menos n; se dois múltiplos estão igualmente próximos, o arredondamento é feito para a escolha uniforme
Portanto, na v2.7.3 :
In [85]: round(2.5)
Out[85]: 3.0
In [86]: round(3.5)
Out[86]: 4.0
como eu esperava. No entanto, agora na v3.2.3 :
In [32]: round(2.5)
Out[32]: 2
In [33]: round(3.5)
Out[33]: 4
Isso parece contra-intuitivo e contrário ao que eu entendo sobre arredondamentos (e com a intenção de enganar as pessoas). O inglês não é minha língua nativa, mas até ler isso, pensei que sabia o que significava o arredondamento: - / Tenho certeza de que, na época em que a v3 foi introduzida, devia haver alguma discussão sobre isso, mas não consegui encontrar uma boa razão para isso. minha pesquisa.
- Alguém tem uma idéia de por que isso foi alterado para isso?
- Existem outras linguagens de programação convencionais (por exemplo, C, C ++, Java, Perl, ..) que fazem esse tipo de arredondamento (para mim inconsistente)?
O que estou perdendo aqui?
UPDATE: O comentário de @ Li-aungYip sobre "Arredondamento de banqueiro" me deu o termo de pesquisa / palavras-chave corretas para pesquisar e encontrei a seguinte pergunta: Por que o .NET usa o arredondamento de banqueiros como padrão? , então eu vou ler isso com atenção.
fonte
Respostas:
A maneira do Python 3.0 é considerada o método de arredondamento padrão atualmente, embora algumas implementações de linguagem ainda não estejam no barramento.
A técnica simples "sempre arredondar 0,5 para cima" resulta em um leve viés em direção ao número mais alto. Com um grande número de cálculos, isso pode ser significativo. A abordagem do Python 3.0 elimina esse problema.
Há mais de um método de arredondamento em uso comum. O IEEE 754, o padrão internacional para matemática de ponto flutuante, define cinco métodos de arredondamento diferentes (o usado pelo Python 3.0 é o padrão). E há outros.
Esse comportamento não é tão amplamente conhecido como deveria ser. O AppleScript foi, se bem me lembro, um dos primeiros a adotar esse método de arredondamento. O
round
comando no AppleScript realmente oferece várias opções, mas o arredondamento para o par é o padrão, como é o IEEE 754. Aparentemente, o engenheiro que implementou oround
comando ficou tão cansado de todas as solicitações para "fazê-lo funcionar como eu aprendi em" escola "que ele implementou exatamente isso:round 2.5 rounding as taught in school
é um comando AppleScript válido. :-)fonte
3
para2.5.round
Você pode controlar o arredondamento obtido no Py3000 usando o módulo Decimal :
fonte
ROUND_HALF_UP
é igual ao antigo comportamento do Python 2.X.setcontext()
função.quantize(decimal.Decimal('1')
paraquantize(decimal.Decimal('0.00')
se deseja arredondar para os 100 mais próximos, como por dinheiro.round(number, ndigits)
tempo quendigits
for positivo, mas irritantemente você não pode usá-la para substituir algo assimround(5, -1)
.Apenas para adicionar aqui uma observação importante da documentação:
https://docs.python.org/dev/library/functions.html#round
Portanto, não se surpreenda ao obter os seguintes resultados no Python 3.2:
fonte
2.675
exatamente: o mais próximo possível do computador2.67499999999999982236431605997495353221893310546875
. Isso é bem próximo, mas não é exatamente igual a2.675
: é um pouco mais próximo2.67
do que2.68
. Portanto, around
função faz a coisa certa e a arredonda para o valor mais próximo de 2 dígitos após o ponto, a saber2.67
. Isso não tem nada a ver com Python, e tudo a ver com ponto flutuante binário.Recentemente, também tive problemas com isso. Por isso, desenvolvi um módulo python 3 que possui 2 funções trueround () e trueround_precision () que abordam isso e dão o mesmo comportamento de arredondamento usado na escola primária (não o arredondamento de banqueiros). Aqui está o módulo. Apenas salve o código e copie-o ou importe-o. Nota: o módulo trueround_precision pode alterar o comportamento do arredondamento, dependendo das necessidades, de acordo com os sinalizadores ROUND_CEILING, ROUND_DOWN, ROUND_FLOOR, ROUND_HALF_DOWN, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_UP e ROUND_05UP no módulo decimal (consulte a documentação desses módulos para obter mais informações). Para as funções abaixo, consulte as instruções ou use help (trusteound) e help (trueround_precision) se copiado em um intérprete para obter mais documentação.
Espero que isto ajude,
Narnie
fonte
O Python 3.x arredonda 0,5 valores para um vizinho que é
no entanto, pode-se alterar o arredondamento decimal "voltar" para sempre arredondar 0,5, se necessário:
fonte
Comportamento de arredondamento do Python 2 no python 3.
Adicionando 1 nas 15 casas decimais. Precisão de até 15 dígitos.
fonte
2.675
é2.67499999999999982236431605997495353221893310546875
. A adição de 1e-15 fará com que caia mais de 2.675 e a arredonde corretamente. se a fração já estiver acima da constante do código, adicionar 1e-15 não mudará nada no arredondamento.Alguns casos:
Para correção:
Se você quiser mais casas decimais, por exemplo 4, adicione (+ 0,0000001).
Trabalhe para mim.
fonte
Reprodução de amostra:
API: https://docs.python.org/3/library/functions.html#round
Estados:
Dada essa percepção, você pode usar um pouco de matemática para resolvê-la
agora você pode executar o mesmo teste com my_round em vez de round.
fonte
A maneira mais fácil de arredondar no Python 3.x, como ensinado na escola, é usar uma variável auxiliar:
E estes serão os resultados das séries 2.0 a 3.0 (em 0.1 etapas):
fonte
Você pode controlar o arredondamento usando o módulo math.ceil:
fonte
Tente este código:
O resultado será:
Saída você pode conferir aqui: https://i.stack.imgur.com/QQUkS.png
fonte