Ir para conteúdo
Fórum Script Brasil
  • 0

Problema Com Ponto Flutuante


LucianoAngelini

Pergunta

Boa Tarde a todos .....

Estou desenvolvento um programa de controle de nota do produtor ..... para dar baixa nas notas eu uso no meu form um ListView...... os campos são código do produtor/quantidade/valor unitario ....tem os botões adicionar e remover do listView os produtos. O que acontece que quando vou inserir um valor maior que 999,99 da um erro de ponto flutuante o código do botoão adicionar é esse:

procedure TformLiqNotas.SpeedButton1Click(Sender: TObject);

var

ListItem : TListItem ;

Quantidade : integer ;

valor : double ;

Valor_T : double ;

i : integer ;

soma : double ;

begin

Quantidade := StrToint(edtQtde.text) ;

Valor := DblValue(edtvlr.text) ;

Valor_T := valor * quantidade ;

ListItem := ListView1.Items.Add ;

ListItem.caption := edtCodigo.text ;

ListItem.SubItems.Add(edtDescri.text) ;

ListItem.SubItems.Add(edtUn.text);

ListItem.SubItems.Add(edtqtde.text);

ListItem.SubItems.Add(edtvlr.text);

ListItem.SubItems.Add(formatfloat('#,##0.00',Valor_T));

//até aqui esta certo

soma := 0 ;

for I := 0 to ListView1.Items.Count - 1 do

begin

with ListView1.Items.Item do

begin

soma := soma + DBlValue(subItems.Strings[4]) ;

end;

label20.caption := formatfloat('#,##0.00',soma) ;

end;

edtCodigo.Clear ;

edtDescri.Clear ;

edtUn.Clear ;

edtQtde.Clear ;

edtVlr.Clear ;

edtCodigo.setfocus ;

end;

Abaixo da linha //até aqui esta certo ... se eu colocar: label20.caption := formatfloat('#,##0.00', valor_t), ele joga o valor correto na label .... mas se passar pelo calculo do listView da o erro de ponto flutuante !!!!!!

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Opa

Hmm olhando seu código o erro aparenta ser o seguinte, no subitems[4]

você faz o valor do produto vezes a quantidade e joga no listview formatando

como dinheiro:

Quantidade := StrToint(edtQtde.text) ;

Valor := DblValue(edtvlr.text) ;

Valor_T := valor * quantidade ;

ListItem.SubItems.Add(formatfloat('#,##0.00',Valor_T));

Certo, então se o valor de cada produto é 100 e a quantidade é 3 então

aquele subitem vai receber formatado 300,00...

Agora o problema é que um valor Real/Double é de alta precisão mas não suporta

vírgulas como separação apenas pontos e quando você faz um loop pra soma total,

ele da um "is not a valid floating point value" por causa da vírgula, se por exemplo

ao invés de 100,00 fosse 100.00 ele aceitaria numa boa...

Não sei se existe alguma função específica para isso, mas se ninguém souber uma

maneira de se resolver isso através de funções do Delphi podemos criar uma função

para você para converter valores formatados como dinheiro para ter suporte a soma

de alta precisão (Real/Double);

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
...

Não sei se existe alguma função específica para isso, mas se ninguém souber uma

maneira de se resolver isso através de funções do Delphi podemos criar uma função

para você para converter valores formatados como dinheiro para ter suporte a soma

de alta precisão (Real/Double);

Pelo que entendo até deveria ter, mas não consegui fazer funcionar até hoje. A função StrFloat tem um overload que permite que seja passados os parâmetros de formatação:

function StrToFloat(const S: string; const FormatSettings: TFormatSettings): Extended; overload;

Supostamente, se obtermos as formatações da localidade (conf. do windows), e passarmos a função, ela deveria fazer a conversão corretamente. Ex.:

var
  Valor :Extended;
  FrmtSetting :TFormatSettings;
begin
  GetLocaleFormatSettings(LOCALE_USER_DEFAULT, FrmtSetting);
  Valor := StrToFloat(Edit1.Text, FrmtSetting);
...
Só que não dei jeito não. :angry: Tenta utilizar esta função:
function StrValueToFloat(Value :string) :Extended;
begin
  while Pos('.', Value) > 0 do
    Delete(Value, Pos('.', Value), 1);

  Result := StrToFloatDef(Value, 0);
end;

O uso de StrToFloatDef é só para garantir um 0.00 quando o string for nulo.

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...