Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

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.

  • Moderadores
Postado
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

 

 

Postado

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
  • Este tópico foi criado há 2851 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.