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

(Resolvido) Famoso arredondamento


DiabloX3

Pergunta

Sim, existe vários tópicos já criados sobre isso, mas todos que vi falam de arredondamentos simples, ou tudo pra baixo ou pra cima.

Eu vejo o meu um pouco diferente.

Primeiro: tenho um select que vai me retornar o valor das parcelas

SELECT SUM(V.VEN_TOTAL / F.PAR_NUM) AS PARCELA FROM CONTAS_RECEBER WHERE CODIGO_PEDIDO = :CODIGO
O valor de retorno para uma divisão de R$ 254,40 é R$84,80. Correto. A questão agora é a seguinte. Tivemos que usar aqui uma função para não arredondar a 3 casa decimal e optaram por usar int da unit System, sendo então que R$ 251,367 iria retornar 251,36 e é isso que preciso, que ignore a 3ª casa mesmo sendo 9 e pegue as 2 casas fixas sem arredondar nem pra cima nem pra baixo. Pelo menos nesse formuláro de nota esta funcionando. Então pegamos e colocamos na geração das parcelas também mas daí acontece um erro que eu não descobri o motivo. O valor retornado da PARCELA é 84,80 só que quando passa pelo
parcela :=  int(qryPagto.FieldByName('PARCELA').AsFloat*100)/100;
O valor de retorno é 84,79! Daonde vem esse valor pra baixo? Eu vi esse post do Micheus e fez entender as funções Tópico só que não posso usar Trunc porque preciso das duas decimais... não posso usar round nem formatfloat porque ele arredonda pra cima e o int está me retornando esse problema. Como resolvo? edit
parcela :=  Trunc(qryPagto.FieldByName('PARCELA').AsFloat*100

Mesmo exemplo com a Trunc. O valor da PARCELA = 84,8 quando multiplico por 100 e passo pelo trunc ele devolve 8479 ...

Editado por DiabloX3
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0
sendo então que R$ 251,367 iria retornar 251,36 e é isso que preciso, que ignore a 3ª casa mesmo sendo 9 e pegue as 2 casas fixas sem arredondar nem pra cima nem pra baixo. Pelo menos nesse formuláro de nota esta funcionando. Então pegamos e colocamos na geração das parcelas também mas daí acontece um erro que eu não descobri o motivo.

Um exemplo para voce testar

procedure TForm1.Button1Click(Sender: TObject);
var preço, valor : real;
begin
   //sendo então que R$ 251,367 iria retornar 251,36 e é
   //isso que preciso

   Edit1.Text := '251,367';

   preço := strtofloat(Edit1.Text);
   valor := int(preço*100)/100;
   Edit2.Text := floattostr(valor);

   Edit3.Text := format('%n',[(preço*100)/100]);

   Edit4.Text := floattostr(round((preço*100))/100);

   Edit5.Text := format('%*.*f',[8,2,(preço*100)/100]);

   Edit6.Text := format('%m',[int(preço*100)/100]);

end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Caramba, trabalhar com isso é delicado e pode ser complicado mesmo ein ehehe

Eu testei aqui e realmente funciona Jhonas porém eu acabei descobrindo o seguinte (que até deixa a aplicação mais clara):

Separei em 3 partes

total_parcelas := qryPagto.FieldByName('PARCELA').AsFloat*100;
total_parcelas := Trunc(total_parcelas);
total_parcelas := total_parcelas/100;

Quando utilizo tudo numa linha ele retorna o valor errado, mas separando dessa forma consegui tirar a 3ª casa decimal e operar com o valor exato da minha parcela.

Obrigado pela sua resposta também.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Jhonas, voltei a olhar o tópico e o caso é o seguinte: o edit2 e o edit6 foram os que me retornaram o valor de 251,36. Coloquei ainda o edit1 recebendo 251,36799999999 e o valor retornado foi 251,36. Porém não dá pra confiar nesses valores. Como expliquei na abertura do tópico AS VEZES é retornado 251,36, AS VEZES 251,37 . Depende muito (de não sei o que além) dos numeros que estou trabalhando. Juntar o int com a multiplicação *100/100 como no edit6 não resolve o problema por completo pois se estiver utilizando variáveis com o valor real pode acontecer como no exemplo do tópico, ele retroagir um valor. Inexplicavelmente isso acontece mesmo se utilizar

valor := preço*100
valor := Trunc(valor)
valor := valor/100

até nessas circunstâncias o meu valor pode vim errado. Não entendo que tipo de operação o Delphi tem por de tras pra fazer uma multiplicação tão simples e retornar valroes incompatíveis. Se puder me ajudar a entender seria de grande ajuda.

p.s: eu comentei novamente no tópico Commit x IBX, acho que passou e você acabou esquecendo de ver, se puder dá outra comentada lá também.

Abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Jhonas, voltei a olhar o tópico e o caso é o seguinte: o edit2 e o edit6 foram os que me retornaram o valor de 251,36. Coloquei ainda o edit1 recebendo 251,36799999999 e o valor retornado foi 251,36. Porém não dá pra confiar nesses valores. Como expliquei na abertura do tópico AS VEZES é retornado 251,36, AS VEZES 251,37 . Depende muito (de não sei o que além) dos numeros que estou trabalhando. Juntar o int com a multiplicação *100/100 como no edit6 não resolve o problema por completo pois se estiver utilizando variáveis com o valor real pode acontecer como no exemplo do tópico, ele retroagir um valor. Inexplicavelmente isso acontece mesmo se utilizar

Experimente usar uma variavel do tipo double no lugar de uma variavel do tipo real

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Vale lembrar que variável real já tem como retorno o tipo double -> Real: Double. Isso funcionaria ou seria melhor usar variáveis do tipo Currency em todo o sistema quando a questão é fazer comparações?

Outra coisa, você intende por mais correto usar Float, Double/Precision ou Numeric 18,2 em campos monetários no Firebird?

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Vale lembrar que variável real já tem como retorno o tipo double -> Real: Double. Isso funcionaria ou seria melhor usar variáveis do tipo Currency em todo o sistema quando a questão é fazer comparações?
Eu prefiro usar sempre o tipo Currency

Outra coisa, você entende por mais correto usar Float, Double/Precision ou Numeric 18,2 em campos monetários no Firebird?

se for trabalhar com valores como 251,36799999999 prefira usar o Double/Precision

abraço

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,1k
    • Posts
      651,8k
×
×
  • Criar Novo...