Arredondamento de Valores

Um problema muito chato de resolver é arredondar valores.


E quando se trata de NFe e suas muitas regras contribui grandemente para aumentar a chatice, pois a sensibilidade dos campos dos tributos aumentou, claro.....


Então alguns clientes começaram a reclamar e algumas notas deixaram de ser enviadas por divergências nos campos Base de calculo, ICMS total e etc, então em todas esta situações sempre observei que tratava-se de algumas pequenas diferenças... coisa de 0,01 ou 0,02 para mais ou para menos... e advinha quem era o culpado...?????

As funções matemáticas existentes na biblioteca Math do DELPHI "todo poderoso", pelo menos até onde li, não ajudaram muito... e claro vamos as soluções paralelas, ajustes técnicos, ou como alguns gostam de chamar... " GAMBIARRAS "...


No exemplo, temos um valor de entrada:

525,245 simples né!!! pois é mais ai é que começa a palhaçada... a receita devolve a nota por divergência do somatório do total dos itens da nfe em relação a base de calculo da nota, então percebi que meu calculo retorna 525,25 e no danfe da nfe não autorizado retorna 525,24.


Então, como não sou o maior dos experts em DELPHI... e depois de ler muito de nada na internet resolvi aplicar a solução abaixo, para tentar enganar o compilador e e eliminar os dígitos desnecessários.


function Arredonda(Valor: Double): Double;
var
  v,v2,dig,vl: String;
begin
 // Result := SimpleRoundTo (Valor,-3);

  v2  := FloatToStr(Valor);
  v   := copy(v2,0,pos(',',v2)-1) ;
  dig :=  copy(v2,pos(',',v2)+1,2) ;

  Result := StrToFloat(v+','+dig) ;
end;


Ta eu sei... ta feio... mas acho que vai funcionar... vou testar e depois volto pra contar vantagem ou afogar as magoas...

....


Apos testes, estou retornando para afogar as magoas...

Não funcionou devido valores sem ponto flutuante não estarem sendo tratadas então, temos que fazer ajustes.

function TRSI.Arredonda(Valor: Double): Double;
var
  v,v2,dig,vl: String;
begin
//  Result := SimpleRoundTo (Valor,-3);

  v2  := formatFloat('#0,00', Valor);
  v   := copy(v2,0,pos(',',v2)-1) ;
  dig :=  copy(v2,pos(',',v2)+1,2) ;

  Result := StrToFloat(v+','+dig) ;
end;

Comentários

Postagens mais visitadas deste blog

AWS para Desenvolvedores - Dominando S3 com Delphi

Preenchendo com zeros a esquerda de um valor com Firebird

Selecionando apenas o ultimo registro inserido com SQLite