sábado, 23 de novembro de 2024
Home
Artigos
Banco de Dados
Access
Firebird
Microsoft SQL Server
MySql
Oracle
Sybase
BI
QlikView
Dicas de Internet
e-business
Hardware
Multimídia
Flash
Programação
.NET/ASP.NET
.NET/C#
.NET/Framework
.NET/VB.NET
ASP
C/C++
Clipper
Cobol
CSS
Delphi
Java
Javascript
JSP
Palm
Perl
PHP
Shell
Visual Basic
WAP
Redes
Segurança
Servidores E-mail
Servidores Web
Apache
Microsoft IIS
Sistemas Operacionais
AIX
DOS
HPUX
Linux
Palm OS
Solaris
True64
Windows 7
Windows 9X
Windows NT
Windows Vista
Windows XP
Software Review
PC
Storages
Veritas VM
Conteúdo atual do site:
[807] ítens, entre artigos, funções e documentos.
Pesquisa Rápida:
Últimos 3 acessos:
Alexandre Neves 03/03/2015 11:08:01 167 acesso(s) alexandre neves 03/03/2015 11:06:42 1 acesso(s) Marcelo Torres 21/01/2015 15:24:53 61 acesso(s)
Opções:
Listagem completa Listagem simples
Ranking Colaboradores:
Adenilton Rodrigues - [304] Alexandre Neves - [61] Douglas Freire - [54] Marcelo Giovanni - [53] Marcelo Torres - [43] Angelita Bernardes - [31] Addy Magalhães Cunha - [28] Manuel Fraguas - [24] Ludmila Valadares - [20] Marcelo Capelo - [18]
Com a necessidade de um arredondamento correto, resolvi escrever este artigo. Estas dicas vai resolver problemas de arredondamento, que encontrei no banco MySql com a função (round) e outros bancos tb. Alem de o próprio Delphi ter alguns problemas também.
O Arredondamento exige um padrão exemplo : se colocarmos um valor como R$ 1.005 ele deve ser arredondado no casos de duas casa decimais para R$ 1.01 correto, então vemos que na terceira casa decimal os valores 0,1,2,3 e 4 serão arredondados para baixo, e 5,6,7,8 e 9 para cima. Mas o problema não fica por ai, no banco MySql por exemplo a função ROUND tem um problema, no exemplo do R$ 1,005 ele não arredonda para R$1,01, o problema do Round do MySql se encontra em uma biblioteca feita em C, que é usado pela compilação do banco de dados. Mas o problema continua com o Delphi na função round tb, que por sua vez arredonda as casas decimais levando em consideração mais casas decimais do que deve, exemplo: exemplo: no valor R$ 1,00499999 neste caso o valor tem que ser R$ 1,00, mas a função do Delphi arredonda para R$ 1,01. Você deve estar se perguntando, o que isso implica em que?, Mas acredite implica e muito, um exemplo simples onde o problema é claro, é no caso de uma impressora fiscal, estes tipos de impressoras tem seu próprio software interno, ela multiplica e ela arredonda sozinha, pois é passado somente o preço unitário e a quantidade, ela também tem dispositivo de proteção, ou seja, um fechamento de cupom que exige um valor maior ou igual a da venda para fechar este cupom, no caso de faltar um centavo, a impressora não fecha a venda, mas seu software dependendo de como foi desenvolvido, ele sim fecha a venda, e quando você for usar a impressora novamente ela encontra-se esperando este 1 centavo, ai pronto já complicou tudo.. Depois de muito ter procurado a solução para isso, eu encontrei uma função para isso, no MySql pode ser usado assim : FLOOR(numero * 100 + 0.505)/100 esta parecia que funciona mas ela tb leva em consideração mais de 3 casas decimais, como funciona isso, a função FLOOR arredonda pra baixo o numero que é multiplicado por 100 somado com 0.505 e o resultado disso é dividido por 100, mas geralmente este numero indicado no exemplo é uma multiplicação ou coisa parecida, por isso pode dar resultado com mais de três casas decimais então pode dar problemas ainda com números como 1,00499999 que ficaria 1,01 no entando era pra fica como 1,00 mesmo, a solução final foi: FLOOR(truncate(numero * 100,3) + 0.505)/100 esta é uma solução que eu garanto que funciona, o truncate descarta o resto das casas decimais trabalhando então somente com 3 casas, isso é feito tb pelo excel, e pela impressoras fiscais tb. Uma outra solução para o MySql com o Round é adicionar 0.000001 assim: ROUND(truncate(numero,3)+0.000001) isso tb funciona legal. No caso do Delphi é só descartar com o truncate as outras casas decimais que funcionará legal. Uma Dica: Geralmente usamos o arredondamento para fazer uma conta em um select, mas tome cuidado com a função sum(), ela deve fica por fora (envolvendo a função de arredondameto) assim: sum( FLOOR(truncate((campo*outro_campo) * 100,3 ) + 0.505)/100 ) desta foram ele arredonda cada numero antes de somar, se você usar assim: FLOOR(truncate((sum(campo*outro_campo)) * 100,3) + 0.505)/100 será somado e multiplicado tudo errado primeiro, e só depois arredondado, ou seja ele vai arredondar corretamente um valor já somado e multiplicado errado, ai não adianta Espero ter ajudado... Giovanni. Quebra-Linha Colaborador..: Giovanni Allan Buranello Categoria(s).: Delphi; Programação; PHP; MySql; Banco de Dados; Visual Basic; Artigos; Versão.......: 1 Data.........: 14/03/2006 09:35:42 Visualizado..: 27389 vezes Fonte........: Giovanni Allan Buranello
Giovanni Allan Buranello
Delphi Programação PHP MySql Banco de Dados Visual Basic Artigos
Últimos Artigos deste colaborador ARREDONDAMENTO CORRETO PARA SQL, BANCO MYSQL E DELPHI - 14/03/2006 09:35:42
Últimos Artigos desta categoria Usando a função MessageBox - 16/06/2006 15:47:15 Atualização de Sistemas - 06/10/2005 01:07:16 CRÍTICA DE DATAS NO OBJETO EDIT SEM MENSAGEM DE ERRO DO DELPHI - 17/03/2006 14:58:31
8 pessoa(s) on-line neste site.