Ir para conteúdo
  • Cadastre-se

dev botao

Problema com arredondamento em campo float


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

Recommended Posts

Pessoal, tenho um campo para informação de preço que possui 10 casas decimais. Isso no clientdataset gera um campo do tipo float. Nesse campo eu uso a máscara "###,###,##0.00########", ou seja, para a parte dos decimais exibe sempre duas casas, e quantas mais existirem até 10. Entretanto alguns valores quando digitados acabam sendo alterados numa tentativa de arredondamento pelo cds. Por exemplo, ao se digitar "1.114.313,68" ele aparece como "1.114.313,6799999999":

img1.jpg.991e7eebd685eb3d48f63ef2a5f5d891.jpg

Isso vai se repetir também no DANFe:

img2.jpg.a745a5bffaada34ba0b0dc1446b71cf5.jpg

Eu sei que valores de ponto flutuante podem gerar distorção nos valores, mas será que não existe algum outro tipo de máscara, algum componente que consegue tratar isso melhor, sei lá, pra evitar esse tipo de situação?

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Juliomar Marchetti disse:

Mas se a gente notar está os 10 ali dos decimais que tu informou

Não, na verdade não foram informados esses decimais, o valor digitado foi "1.114.313,68", apenas com dois decimais. O problema é que ao digitar o valor no campo, ele é alterado para esse número com mias decimais aí.

Eu atribuo isso ao problema de precisão que o float possui, mas queria ver se tem alguma maneira de contornar mesmo.

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
  • Consultores
Em 14/05/2021 at 17:45, Túlio de Pádua disse:

Eu sei que valores de ponto flutuante podem gerar distorção nos valores, mas será que não existe algum outro tipo de máscara, algum componente que consegue tratar isso melhor, sei lá, pra evitar esse tipo de situação?

Não... Não é a máscara que gera a distorção. É o tipo flutuante.

Explicação longa:
http://rvelthuis.de/articles/articles-floats.html

 

Em 17/05/2021 at 11:02, Túlio de Pádua disse:

Eu atribuo isso ao problema de precisão que o float possui, mas queria ver se tem alguma maneira de contornar mesmo.

A única maneira é usar um tipo que não seja ponto flutuante. Por exemplo Currency.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Em 01/06/2021 at 12:07, EMBarbosa disse:

Não... Não é a máscara que gera a distorção. É o tipo flutuante.

Explicação longa:
http://rvelthuis.de/articles/articles-floats.html

 

A única maneira é usar um tipo que não seja ponto flutuante. Por exemplo Currency.

O artigo aprofunda bastante, e cita num ponto algo que pode resolver parte no meu problema:

"If space or speed are not as important as accuracy, use the Extended type throughout, because Delphi also uses it internally in most system functions."

Usar o tipo extended realmente fornece uma precisão melhor:

procedure TForm1.Button4Click(Sender: TObject);
var
  val1: Double;
  val2: Extended;
begin

  val1 := 1114313.68;
  val2 := 1114313.68;

  Memo1.Lines.Clear;

  Memo1.Lines.Add(FormatFloat('###,###,##0.00########', val1));
  Memo1.Lines.Add(FormatFloat('###,###,##0.00########', val2));

end;

O resultado da formatação acima seria:

1.114.313,6799999999
1.114.313,68

Com algum trabalho eu poderia alterar para que esse campo em tela mostrasse o valor a partir de uma variável extended, mas no ACBr como as variáveis são double, no DANFe o valor ainda sairia com a distorção. Ou seja, sem resolução total.

Isso é para o valor unitário do produto em NFes, e sim, alguns usuários necessitam de toda essa quantidade de casas decimais, o que não me permite então fazer o uso de currency.

E o outro problema é tentar fazer usuário leigo entender como um tipo flutuante funciona, e assim o valor que ele digita não é exibido fielmente na tela e no DANFe.

De qualquer forma obrigado, eu vou manter isso assim mesmo.

Link para o comentário
Compartilhar em outros sites

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