15498 - Critérios arredondamento
Problema: Precisamos confirmar o critério de arredondamento utilizado pelas funções Arredonda(), ArredondarValor() e ArredondarValorEx().
O cliente entrou em contato questionando o critério de arredondamento do ERP quando o algarismo arredondado é o 5. Em determinadas situações se mantém o número anterior e em outras situações soma-se 1 unidade. Veja abaixo exemplo prático utilizando a função Arredonda(valor,3):
1)
2,70 * 1,90 * 1,35 = 6,9255
Arredondando = 6,926
2)
2,75 * 1,90 * 1,70 = 8,8825
Arredondando = 8,882
3)
2,90 * 1,95 * 1,10 = 6,2205
Arredondando = 6,221
Nos casos 1 e 3 foi somada uma unidade e no caso 2 o último algarismo foi mantido. Esse mesmo comportamento se repetiu para a função ArredondarValor(), porém a função ArredondarVAlorEx() somou uma unidade também no caso 2. Por que essa diferença?
Existe a norma técnica ABNT NBR 5891:2014 (em anexo) que trata de arredondamento de valores e nela consta que caso o algarismo anterior seja ímpar deve-se somar uma unidade, caso seja par deve-se manter, mas vejam o terceiro caso onde o último algarismo é zero e foi somada uma unidade.
Qual é o critério de arredondamento utilizado para cada função?
Rotina / Tela: Regras em geral no ERP
Solução: Solução 15498: A norma se contradiz nos itens 2.2 e 2.4 em relação ao valor de 4.850. No item 2.1 diz que arredonda para 4.9 e no 2.4 diz que arredonda para 4.8. Não está claro qual delas deve prevalecer. Nossas funções arredondam para cima (item 2.1).
Quando a função 'Arredonda' foi criada, a ArredondarValor já estava criada e sendo usada. Ambas foram mantidas para efeito de compatibilidade, mas funcionam da mesma forma.
A função ArredondarValorEx usa um cálculo diferente com o objetivo de dar mais precisão.
Nos cálculos, mesmo o número sendo mostrado como 0(zero), internamente(na memória do cálculo) pode não ser. Se for feito o cálculo 2.90 * 1.95 * 1.10, internamente não é armazenado na memória somente os números 6.2205.
O cliente entrou em contato questionando o critério de arredondamento do ERP quando o algarismo arredondado é o 5. Em determinadas situações se mantém o número anterior e em outras situações soma-se 1 unidade. Veja abaixo exemplo prático utilizando a função Arredonda(valor,3):
1)
2,70 * 1,90 * 1,35 = 6,9255
Arredondando = 6,926
2)
2,75 * 1,90 * 1,70 = 8,8825
Arredondando = 8,882
3)
2,90 * 1,95 * 1,10 = 6,2205
Arredondando = 6,221
Nos casos 1 e 3 foi somada uma unidade e no caso 2 o último algarismo foi mantido. Esse mesmo comportamento se repetiu para a função ArredondarValor(), porém a função ArredondarVAlorEx() somou uma unidade também no caso 2. Por que essa diferença?
Existe a norma técnica ABNT NBR 5891:2014 (em anexo) que trata de arredondamento de valores e nela consta que caso o algarismo anterior seja ímpar deve-se somar uma unidade, caso seja par deve-se manter, mas vejam o terceiro caso onde o último algarismo é zero e foi somada uma unidade.
Qual é o critério de arredondamento utilizado para cada função?
Rotina / Tela: Regras em geral no ERP
Solução: Solução 15498: A norma se contradiz nos itens 2.2 e 2.4 em relação ao valor de 4.850. No item 2.1 diz que arredonda para 4.9 e no 2.4 diz que arredonda para 4.8. Não está claro qual delas deve prevalecer. Nossas funções arredondam para cima (item 2.1).
Quando a função 'Arredonda' foi criada, a ArredondarValor já estava criada e sendo usada. Ambas foram mantidas para efeito de compatibilidade, mas funcionam da mesma forma.
A função ArredondarValorEx usa um cálculo diferente com o objetivo de dar mais precisão.
Nos cálculos, mesmo o número sendo mostrado como 0(zero), internamente(na memória do cálculo) pode não ser. Se for feito o cálculo 2.90 * 1.95 * 1.10, internamente não é armazenado na memória somente os números 6.2205.
Após a 4ª.casa tem outros números que não são mostrados e que irão influenciar o arredondamento da função ArredondarValorEx.
Nos locais onde a precisão maior é imprescindível pode ser feito o arredondamento pela casa desejada mais 1. Isso retira eventuais 'sujeiras' e vai aumentar a precisão.
Ex.:
Deseja-se o arredondamento na 3a.casa. Executa-se um arredondamento na 4a.casa e em seguida um na 3a.casa.
ArredondarValor(Base,4); @ arredonda na 4ª.casa @
ArredondarValor(Base,3); @ arredonda na 3ª.casa, que é o objetivo @
Com isso, todas as funções atingem o mesmo resultado.
Nos locais onde a precisão maior é imprescindível pode ser feito o arredondamento pela casa desejada mais 1. Isso retira eventuais 'sujeiras' e vai aumentar a precisão.
Ex.:
Deseja-se o arredondamento na 3a.casa. Executa-se um arredondamento na 4a.casa e em seguida um na 3a.casa.
ArredondarValor(Base,4); @ arredonda na 4ª.casa @
ArredondarValor(Base,3); @ arredonda na 3ª.casa, que é o objetivo @
Com isso, todas as funções atingem o mesmo resultado.