Dilema de arredondamento de meio flutuador
Encontrando uma estranheza com a função round()? Observe o seguinte comportamento:
for i in range(1, 15, 2): n = i / 2 print(n, "=>", round(n))
Você pode esperar que os valores flutuantes sejam consistentemente arredondados, mas eles surpreendentemente são arredondados para o número par mais próximo.
Razão por trás do comportamento
A documentação para tipos numéricos esclarece esse comportamento peculiar com a declaração "round(x[, n]) x arredondado para n dígitos, arredondando metade para até." Isso é conhecido como arredondamento de banqueiros. Em vez de arredondamentos persistentes para cima ou para baixo, o que amplificaria os erros de arredondamento, o arredondamento dos banqueiros compensa visando o número par mais próximo. , aproveite o módulo decimal. Este módulo fornece opções para especificar estratégias de arredondamento específicas. Por exemplo, para arredondar da metade:
>>> from decimal import localcontext, Decimal, ROUND_HALF_UP >>> com localcontext() como ctx: ... ctx.arredondamento = ROUND_HALF_UP ... para i no intervalo(1, 15, 2): ...n = Decimal(i)/2 ... imprimir(n, '=>', n.to_valor_integral()) ... 0,5 => 1 1,5 => 2 2,5 => 3 3,5 => 4 4,5 => 5 5,5 => 6 6,5 => 7
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3