Jump to content

logo_acbr_paygo.png

TEF ACBr PayGo
Seja um revendedor e ofereça uma solução completa para seu cliente.


Saiba mais

beneficios.png

click.png

click.png

click.png

click.png

click.png

click.png

click.png

click.png

click.png

click.png click.png click.png

Problema com arredondamento em campo float


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?

 

tulio.jpg.f769746aeef14150d78e571e3a541eb3.jpg

Link to comment
Share on other sites

  • Consultores

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

Consultor SAC ACBr Juliomar Marchetti
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

skype: juliomar
telegram: juliomar
http://www.juliomarmarchetti.com.br
Embarcadero MVP
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil
Link to comment
Share on other 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.

tulio.jpg.f769746aeef14150d78e571e3a541eb3.jpg

Link to comment
Share on other sites

  • 3 weeks later...
  • 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
Ajude o Projeto ACBr crescer - Assine o SAC

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 to comment
Share on other 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.

tulio.jpg.f769746aeef14150d78e571e3a541eb3.jpg

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.