Ir para conteúdo
  • Cadastre-se

dev botao

RoundABNT - Invalid floating point operation


paulorsa
  • Este tópico foi criado há 2631 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

A exception é gerada ao tentar arredondar o nr  9.41212959024529 em 10 casas.

RoundABNT(9.41212959024529,-10)

Debugando percebi que na verdade a exception e gerada em uma função do Delphi a SimpleRoundTo.

Na unit ACBrUtil na linha 580.

PowValue := SimpleRoundTo( FracValue * 10 * Pow, -9) ; // SimpleRoundTo elimina dizimas ;

A versão do Delphi que eu uso e a XE. Não sei se em outras versões ou se no Lazarus também ocorre essa exception.

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Fique a vontade para propor melhorias nos fontes... Use as UnitTestes, para saber se não quebrou algo...

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • Moderadores
20 horas atrás, paulorsa disse:

A exception é gerada ao tentar arredondar o nr  9.41212959024529 em 10 casas.

RoundABNT(9.41212959024529,-10)

Debugando percebi que na verdade a exception e gerada em uma função do Delphi a SimpleRoundTo.

Na unit ACBrUtil na linha 580.

PowValue := SimpleRoundTo( FracValue * 10 * Pow, -9) ; // SimpleRoundTo elimina dizimas ;

A versão do Delphi que eu uso e a XE. Não sei se em outras versões ou se no Lazarus também ocorre essa exception.

Delphi XE5.

 

roundabnt.png

  • Curtir 1
Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Link para o comentário
Compartilhar em outros sites

Eu pedi para um amigo testar no delphi seatle e também funciona, isso quer dizer que é um problema do delphi. Com isso em mente comparei as funções do Delphi XE com a do Delphi Seatle.

 

Delphi XE

function SimpleRoundTo(const AValue: Extended; const ADigit: TRoundToRange = -2): Extended;
var
  LFactor: Extended;
begin
  LFactor := IntPower(10, ADigit);
  if AValue < 0 then
    Result := Trunc((AValue / LFactor) - 0.5) * LFactor
  else
    Result := Trunc((AValue / LFactor) + 0.5) * LFactor;
end;

 

Delphi Seatle.

function SimpleRoundTo(const AValue: Extended; const ADigit: TRoundToRange = -2): Extended;
var
  LFactor: Extended;
begin
  LFactor := IntPower(10.0, ADigit);
  if AValue < 0 then
    Result := Int((AValue / LFactor) - 0.5) * LFactor
  else
    Result := Int((AValue / LFactor) + 0.5) * LFactor;
end;

Como se trata de uma função do Delphi que é usada dentro do RoundABNT, para resolver meu problema eu criei uma Função SimpleRoundToEX igual ao do Delphi Seatle e inclui dentro da unit ACBrUtil, e passei a usar ela no lugar da SimpleRoundTo do Delphi.

Eu não sei se essa seria a melhor opção para o projeto, mas rodei a UnitTestes é funcionou direitinho.

Segue unit para analise.

ACBrUtil.pas

acbrutiltest.pas

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2631 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...