Famosa discussão sobre ponto flutuante, arredondamentos

191 views
Skip to first unread message

Anderson Dapper

unread,
Jan 5, 2012, 10:59:39 AM1/5/12
to dug...@googlegroups.com
Boa tarde,

Sei que este assunto é para quebrar as idéias de qualquer um...

Estou desenvolvendo uma rotina para o calculo dos valores da DAS (Simples Nacional) mas estou com sérios problemas nos arredondamentos, quando os calculos fecham em um dos anexos, estraga no outro.

Alguém sabe de alguma regra para os arredondamentos? Pra cima, Pra baixo, comum, truncar em X casa decimais...

Grato,
Anderson Dapper Rocha

Gustavo Luis Hinterholz

unread,
Jan 5, 2012, 11:02:41 AM1/5/12
to dug...@googlegroups.com
Tche,
Da uma olhada no meu blog http://gustavohinterholz.blogspot.com/, tem um topico de arredondamento inteligente de casa decimal.

Anderson Dapper Rocha

--
Você recebeu esta mensagem porque está inscrito no "DUG-RS -
Delphi Users Group Rio Grande do Sul" em Grupos do Google.
Acesse o nosso BLOG em http://www.dug-rs.org e contribua com a comunidade Delphi do Rio Grande do Sul
Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para
dug-rs-un...@googlegroups.com
Para ver mais opções, visite este grupo em
http://groups.google.com.br/group/dug-rs?hl=pt-BR
Twitter: @dugrs

Eder Gusatto

unread,
Jan 5, 2012, 11:30:32 AM1/5/12
to dug...@googlegroups.com
Buenas,

Os aplicativos desktop da SEFAZ-RS utilizam a unit do link abaixo para os arredondamentos.

http://cc.embarcadero.com/item/21909

Abraço.

______________________________

Éder Gusatto
msn, twitter, gmail, skype: egusatto

On Qui 05/01/12 12:59 , Anderson Dapper toppe...@gmail.com sent:

Samuel M. Basso

unread,
Jan 5, 2012, 11:53:44 AM1/5/12
to dug...@googlegroups.com
Meus problemas que tive com arredondamentos foi por causa do tipo de dados da base de dados.

Utilizo firebird e campos NUMERIC agora passei todos para DOUBLE PRECISION e resolvi os problemas.



2012/1/5 Eder Gusatto <egus...@terra.com.br>



--


Atenciosamente,

Samuel M. Basso
Fone: (54) 3462-5522
Cel: (54) 8135-3723
Skype: samuelbasso
Twitter: @samuelbasso
E-mail/MSN: samue...@gmail.com
Web site: www.otimizy.com.br

Daniel Wildt

unread,
Jan 5, 2012, 12:51:26 PM1/5/12
to dug...@googlegroups.com
Boa discussão. Lembro de uma vez discutir sobre arredondamentos na equipe. Encontramos diferenças de arredondamento quando o processador era Intel ou AMD. 

Vou ir aproveitando as discussões para ir lançando uns posts no blog do DUG-RS. Agendei um para sábado com um resumo do que veio até agora. 

Show de bola. 

Regards,
Daniel Wildt
http://danielwildt.com


2012/1/5 Samuel M. Basso <samue...@gmail.com>

Rafael Santos de Lima

unread,
Jan 6, 2012, 10:53:17 AM1/6/12
to dug...@googlegroups.com
Um grande problema que encontro no arredondamento é o seguinte:
 - Vamos dizer que tenho duas tabelas; uma guarda informações de  CABECALHO ; outra guarda ITENS.
 Tabela CABECALHO contém um campo "valor_total", no qual, calcula os totais dos ITENS, no caso, "valor_unitario" * "quantidade" de todos os ITENS.

Aí é que vem o problema. Em um relatório caso seja mostrado o total do CABECALHO e os ITENS descriminados, se o usuário calcular item por item e comparar com o CABECALHO notará a diferença, porque o relatório mostrará nos ITENS, por exemplo 20,55 (valor_unitario) enquanto no banco de dados o valor REAL do "valor_unitario" é 20,5598777.

Portanto:
  CABECALHO campo VALOR_TOTAL = 41,1197554
  ITENS  "VLR_UNITARIO" = 20,5598777 ; "QUANTIDADE" = 2 TOTAL = 41,1197554

Visualização do usuário (Relatório)
CABECALHO campo VALOR_TOTAL = 41,20
ITENS "VLR_UNITARIO" = 20,56 ; "QUANTIDADE" = 2 = TOTAL = 41,12 (nesse caso o valor pode fechar, mas em um montante dar diferença)

Jefferson Follmann

unread,
Jan 6, 2012, 12:13:23 PM1/6/12
to dug...@googlegroups.com
Rafael: Caso você arredonde corretamente todos os valor antes de popular no banco, este problema não ocorre né?

20,5598777 -> Arredondamos para: 20,56
20,56 * 2 = 41,12 => Igual ao total da NF.
Jefferson Luis Follmann
Fone: (51) 9818-1235


Secaio

unread,
Jan 7, 2012, 5:30:43 AM1/7/12
to dug...@googlegroups.com
tambem costumo usar firebird com campos Double precision e não enfrente problemas desse tipo... passei por isso a algum tempo atras qdo dei manutenção em sistema de terceiros que utilizavam SQL server e campos numeric, como eu não tinha muito conhecimento e tempo de ir atras, nesses casos onde os relatorios nao batiam com a tabela mestre eu ignorava o valor da tabela mestre, e me fazia uso da soma das quantidades * valor unitario da tabela detalhe para exibir valor total nos relatorios

2012/1/6 Jefferson Follmann <jeff.f...@gmail.com>



--
Secaio

Rafael Santos de Lima

unread,
Jan 8, 2012, 1:24:02 PM1/8/12
to dug...@googlegroups.com
Sim Jefferson, mas a dúvida muitas vezes é em relação ao um padrão. Claro que se for arredondado antes de mandar para uma campo total, dará certo, mas seria o ideal sempre arredondar antes? Isso creio que vai depender do tipo de aplicação, se for algo muito exato pode dar problemas.

Armando Bagattini

unread,
Jan 9, 2012, 9:56:17 AM1/9/12
to dug...@googlegroups.com
Usa a função RoundTo

Armando Bagattini Filho
Desenvolvedor/Programador Delphi.
Regras de negócio, análise e desenvolvimento de sistemas.
Serviços de freelancer
Reply all
Reply to author
Forward
0 new messages