🔐 Segredos do arredondamento¶
Você sabe como o round
funciona no python por baixo dos panos? Eu também não sabia e achei interessante.
Vamos fazer alguns experimentos com o round
com alguns cálculos:
\(\frac{7}{2}=\lfloor{3.5}\rceil\implies4\)¶
\(\frac{3}{2}=\lfloor{1.5}\rceil\implies2\)¶
\(\frac{9}{2}=\lfloor{4.5}\rceil\implies5\)¶
Atenção
Porque o python não arredondou para 5?
\(\frac{5}{2}=\lfloor{2.5}\rceil\implies3\)¶
Atenção
Porque o python não arredondou para 3?
Por quê? ¶
Um pouco fora do esperado estes resultados né? Mas tudo tem uma razão
Isso ocorre porque, em Python, a função round
é implementada com o arredondamento bancário, onde todos os valores da metade são arredondados para o número par mais próximo. IEEE 754 recomenda usar este arredondamento.
Info
Institute of Electrical and Electronics Engineers - (IEEE)
Documentação Python Round
Citação original em Inlgês
round(number[, ndigits])¶
Return number rounded to ndigits precision after the decimal point. If ndigits is omitted or is None
, it returns the nearest integer to its input.
For the built-in types supporting round(), values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice (so, for example, both round(0.5)
and round(-0.5)
are 0
, and round(1.5)
is 2
). Any integer value is valid for ndigits (positive, zero, or negative). The return value is an integer if ndigits is omitted or None
. Otherwise, the return value has the same type as number.
For a general Python object number
, round
delegates to number.__round__
.
Note
The behavior of round()
for floats can be surprising: for example, round(2.675, 2)
gives 2.67
instead of the expected 2.68
. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float. See Floating Point Arithmetic: Issues and Limitations for more information.
Após saber disto nunca mais usarei o round
da mesma forma.
Leitura Recomendada (EN): Is bankers rounding really more numerically stable?