Amiguinhos,
Baseado em uma NT que o
JoseQuintas apresentou no
PCToledo e na função que o
kapiaba apresentou, mas não explicou o porque de um tal 0,01 é que pude entender que se tratava de um fator de arredondamento.
O problema que este fator de arredondamento, como dito na NT, serve para arredondar para mais ou para menos o valor afim de se adequar as regras do SEFAZ.
Nossos sistemas não são dotados de inteligencia artificial(ainda) para decidir que momento usar um ou outro método, além daqueles que programamos.
Partindo deste pressuposto elaborei uma função para testar as regras conforne ABNT.
Arredondando a 2 algarismos decimais deveremos ter em atenção o terceiro e quarto decimal. Assim, conforme as regras anteriores:
O número 12,6529 seria arredondado para 12,65 (aqui fica 12.65, uma vez que 29 é inferior a 50, então não se modifica)
O número 12,86512 seria arredondado para 12,87 (aqui fica 12.87, uma vez que 512 é superior a 500, então incrementa-se uma unidade)
O número 12,744623 seria arredondado para 12,74 (aqui fica 12.74, uma vez que 4623 é inferior a 5000, então não se modifica)
O número 12,8752 seria arredondado para 12,88
O número 12,8150 seria arredondado para 12,82 (aqui fica 12.82, uma vez que os algarismos seguintes é igual a 50, então incrementa-se uma unidade)
O número 12,80050 seria arredondado para 12,80 (aqui fica 12.80, uma vez que 050 e menor que 500)
O numero 13,4666..., se fossemos arredondar à parte inteira, será sempre arredondado para 13, pois 4666... sempre será menor que 5000... (Se fizermos o arredondamento número a número, terÃamos : 13,4666... ? 13,47 ? 13,5 ? 14, porém, isso seria afirmar que 13,4666... está mais próximo de 14 do que está de 13, que não é verdade. Portanto, não devemos arredondar o número já previamente arredondado!!!)
FUNCTION ABNTROUND( R_VALOR )
R_VALOR_INT := INT( R_VALOR )
R_VALOR_DEC := ROUND( DEC( R_VALOR ), 2 )
R_VALOR_RND := R_VALOR_DEC - DEC( R_VALOR )
IF R_VALOR_RND >= .0050 .AND. R_VALOR_RND < .00499
R_VALOR_DEC := R_VALOR_DEC + 1
ELSEIF R_VALOR_RND >= .00500 .AND. R_VALOR_RND < .004999
R_VALOR_DEC := R_VALOR_DEC + 1
ELSEIF R_VALOR_RND >= .005000 .AND. R_VALOR_RND < .0049999
R_VALOR_DEC := R_VALOR_DEC + 1
ENDIF
RETURN R_VALOR_INT + R_VALOR_DEC
Com esta função consegui fazer os valores serem calculados baterem com ABNT com excessão do 12,8150 que não arredondou, mesmo porque fiz a função rapidamente.
Nela também o meu valor não se alterou.
Usando a função do
kapiaba os valores bateram com excessão do 12,744623 que arredondou para 12,75 e do 12,80050 que arredondou para 12,81 e do meu valor que foi de 53,6312 para 53,64.
Resumindo:
Para efeitos do fisco, diferenças para cima são aceitas.
Observação:
Não encontrei referencia a função
trunk() e quando pesquisei sobre a função
dec() ou
Decimals vi que só a tenho pois a mesma esta criada em minhas funções.
Em tempos, vou passar a usar a função conforme o cálculo que o
kapiaba apresentou.
Esta mensagem esta sendo reverberada nos foruns aos quais coloquei em pauta.