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.

One Reply 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.

Deixe um comentário

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