Pular para conteúdo

🔐 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\)

Exemplo no Python

# >>>$ round(7/2)
4

\(\frac{3}{2}=\lfloor{1.5}\rceil\implies2\)

Exemplo no Python

# >>>$ round(3/2)
2

\(\frac{9}{2}=\lfloor{4.5}\rceil\implies5\)

# >>>$ round(9/2)
4

Atenção

Porque o python não arredondou para 5? 🤔

\(\frac{5}{2}=\lfloor{2.5}\rceil\implies3\)

# >>>$ round(5/2)
2

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?

Comentários