Arredondamento bancário

O arredondamento aritmético como em geral conhecemos, e que é utilizado na fórmula ARRED(Valor;CasaDecimal) de planilhas eletrônicas como Excel e Calc, funciona assim:

Para arredondar um número na N-ésima casa decimal, observamos a casa decimal seguinte. Se for um algarismo entre 0 e 4, apenas mantemos o número até a N-ésima casa decimal e descartamos as seguintes (arredondamento “para baixo”). Se for 5 em diante, aumentamos uma unidade na N-ésima casa decimal, além de descartar as casas decimais seguintes (arredondamento “para cima”).

Assim, para arredondamentos na segunda casa decimal, exemplos:

  • 12,3449 ⇒ 12,34 (4 < 5, para baixo)
  • 12,3472 ⇒ 12,35 (7 ≥ 5, para cima)
  • 12,3456 ⇒ 12,35 (5 ≥ 5, para cima)
  • 12,345 ⇒ 12,35 (5 ≥ 5, para cima)

Porém, conforme bem explicado no artigo “Um novo algoritmo para arredondamento de resultados” [PDF], por Daniel Homrich da Jornada, consultor na área de metrologia e Diretor Técnico da Certificar, o caso exato em que a casa decimal seguinte é 5, seguida apenas de zeros (ou seja, sem valores nas casas decimais após a N+1), arredondar sempre para cima gera um erro sistemático tendendo sempre ao acréscimo.

Esse desequilíbrio pode ser facilmente ilustrado: imagine as situações em que há apenas a casa decimal seguinte; são 10 possibilidades (0 a 9). Quando ela é zero, não há acréscimo nem decréscimo (estatisticamente, 10% das possibilidades); quando é 1, 2, 3 ou 4, são as 4 possibilidades em que há decréscimo (40%); e quando é 5, 6, 7, 8 ou 9, são 5 possibilidades em que há acréscimo (50%). Ou seja, há mais possibilidades de acréscimo do que de decréscimo.

Para equilibrar estatisticamente as possibilidades do arredondamento, há um método comumente denominado “arredondamento bancário” (em inglês, “banker’s rounding”), definido em normas como a ABNT NBR 5891:2014 – Regras de arredondamento na numeração decimal [PDF]; a ISO 80000-1:2009 – Quantidades e unidades — Parte 1: Geral (sucedeu a ISO 31-0:1992), Anexo B – Arredondamento de números, o NIST SP 811:2008 – Guia para o uso de unidades no sistema internacional, Apêndice B.7; a 754-2008 – Padrão IEEE para aritmética de ponto-flutuante, Seção 4.

O “arredondamento bancário” na N-ésima casa decimal pode ser definido em três regras:

  • Quando o algarismo a ser conservado for seguido de algarismo inferior a 5, permanece o número até o algarismo conservado e descartam-se os posteriores (arredonda “para baixo”).
  • Quando o algarismo a ser conservado for seguido de algarismo superior a 5, ou igual a 5 seguido de no mínimo um algarismo diferente de zero, soma-se uma unidade ao algarismo a ser conservado e descartam-se os posteriores (“para cima”).
  • Quando o algarismo a ser conservado for seguido apenas de 5, e todos os posteriores zerados, arredonda-se o algarismo conservado para o par mais próximo, ou seja, se o algarismo a ser conservado for par, apenas descarta-se o 5 posterior (“para baixo”), e se o algarismo a ser preservado for ímpar, soma-se uma unidade ao algarismo a ser conservado, descartando-se o 5 posterior (“para cima”).

Assim, a distinção entre o arredondamento aritmético e o arredondamento bancário ocorre apenas quando posteriormente ao algarismo a ser conservado há exatamente 5 (ou 500…). Enquanto no arredondamento aritmético arredonda-se sempre para cima neste caso, no arredondamento bancário arredonda-se para cima apenas quando o último algarismo a ser conservado é ímpar.

Exemplos deste caso no arredondamento bancário:

  • 12,345 ⇒ 12,34 (4 é par, para baixo)
  • 12,385 ⇒ 12,38 (8 é par, para baixo)
  • 12,315 ⇒ 12,32 (1 é ímpar, para cima)
  • 12,395 ⇒ 12,40 (9 é ímpar, para cima)

Não há até o momento função nativa do Microsoft Excel ou do LibreOffice Calc para esse tipo de arredondamento. O Portal Certificar disponibiliza para download gratuito um suplemento compatível com Excel 2003 e superiores, com a função ArredCertificar(Valor; CasaDecimal) implementada em linguagem VBA (Visual Basic for Applications).

Eu escrevi uma fórmula nativa do Excel/Calc com o mesmo efeito:

=SE(MOD(Valor*10^(Casas+1);20)=5;
TRUNCAR(Valor;Casas);
ARRED(Valor;Casas))

Vamos entendê-la em partes:

  1. Se a parte posterior à casa a ser conservada é exatamente 5 e o último algarismo a ser conservado é par (uma maneira engenhosa de testar as duas coisas ao mesmo tempo é comparar se o resto da divisão inteira desses algarismos por 20 é exatamente 5): SE(MOD(Valor*10^(Casas+1);20)=5);
    1. Arredonda-se para baixo (truncar): TRUNCAR(Valor;Casas)
  2. Caso contrário, segue-se o arredondamento aritmético normal: ARRED(Valor;Casas)

Vi postagens na internet sugerindo outras fórmulas com efeito equivalente. Por exemplo, esta postagem cita a fórmula:

=ARRED(Valor;Casas)-(MOD(Valor*10^(Casas+1);20)=5)/10^(Casas)

A fórmula acima tira proveito de que um teste lógico como MOD(...)=5 vale 1 se VERDADEIRO e 0 se FALSO; quando o algarismo a ser preservado é par, o teste retorna verdadeiro e isso faz subtrair 1 unidade desse algarismo quando o arredondamento aritmético seria para cima.

O “arredondamento bancário” costuma ser aplicado em cálculos financeiros e bancários, medições laboratoriais, aplicações de engenharia e científicas, dentre outras situações. Espero que o conceito e as fórmulas (VBA e nativa) sejam úteis para muitos.

Nota para desenvolvedores: Enquanto as planilhas de cálculo ainda não contemplam essa regra presente em tantas normas internacionais, felizmente há recursos nativos para isso nas principais linguagens de programação, como em Java a opção java.math.RoundingMode HALF_EVEN com números decimais precisos BigDecimal, o DecimalRound do .NET Framework, o decimal.ROUND_HALF_EVEN de Python etc.

3 Replies to “Arredondamento bancário”

  1. Olá Márcio, agradeço imensamente pelo seu post. Além de proporcionar a solução para o problema, enriqueceu com conhecimento e estratégias para uso de fórmulas no Excel.
    Fiz vários testes das fórmulas apresentadas e notei que em alguns casos ocorrem falha no arredondamento. Dependendo do modo como o o Valor é passado para a operação MOD, pode gerar um valor de ponto flutuante muito grande e ocasionar falha (MOD(Valor*10^(Casas+1);20)).
    Então fiz um pequeno ajuste assim: ARRED(MOD(Valor*10^(Casas+1);20);Casas). Isso vale para ambas as fórmulas apresentadas.

    Forte abraço. Sucesso sempre.

  2. Muito esclarecedor. Procurei bastante antes de encontrar essa informação. Está explicado de uma forma bem didática.
    Muito Obrigado.

  3. Adriano e Gustavo, fico feliz em ter disponibilizado algo que seja útil e esclarecedor. Muito obrigado pelos comentários.
    E agradeço ao Adriano pela contribuição extra de melhoria.
    Saudações!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *