Skip to content

Instantly share code, notes, and snippets.

@facilita-tecnologia
Created March 29, 2014 08:34
Show Gist options
  • Save facilita-tecnologia/9850799 to your computer and use it in GitHub Desktop.
Save facilita-tecnologia/9850799 to your computer and use it in GitHub Desktop.
Breve explicação sobre armazenamento de valores monetario no MySQL
1) Para cálculos monetários no mysql considere o seguinte:
Decimal ou Numeric => precisão para cálculos matemáticos.
Float e Double => Trabalham com arredondamento e aproximação.
Campos tipo: FLOAT, REAL e DOUBLE PRECISION são campos com dados numéricos aproximados.
Enquanto campos tipo NUMERIC, DECIMAL, INTEGER, e SMALLINT são campos de de dados numéricos exatos.
Para valores monetários devem ser usados NUMERIC E DECIMAL para prever com exatidão os valores monetários.
Do manual do mysql ( http://dev.mysql.com/doc/refman/4.1/pt/numeric-types.html ):
"MySQL suporta todos os tipos numéricos da ANSI/ISO SQL92. Estes tipos incluem o tipos de dados numéricos exatos (NUMERIC, DECIMAL, INTEGER, e SMALLINT), assim como o tipos de dados numéricos aproximados (FLOAT, REAL, e DOUBLE PRECISION). A palavra-chave INT é um sinônimo para INTEGER, e a palavra-chave DEC é um sinônimo para DECIMAL.
Os tipos NUMERIC e DECIMAL são implementados como o mesmo tipo pelo MySQL, como permitido pelo padrão SQL92. Eles são usados por valores para os quais é importante preservar a exatidão como, por exemplo, dados monetários. Quando é declarado um campo de algum desses tipos a precisão e a escala podem ser (e normalmente é) especificadas; por exemplo:
salario DECIMAL(5,2)"
No caso do tipo FLOAT a mesma parte do manual diz:
"O tipo FLOAT é usado para representar tipos de dados numéricos aproximados. O padrão SQL-92 permite uma especificação opcional da precisão (mas não da faixa do expoente) em bits, após a a palavra FLOAT e entre parenteses. A implementação MySQL também suporta esta especificação opcional de precisão. Quando FLOAT é usada para uma tipo de coluna sem especificação de precisão, MySQL utiliza quatro bytes para armazenar os valores. Uma sintaxe variante também é suportada, com dois numeros entre parenteses após a palavra FLOAT. Com esta opção, o primeiro número continua a representar a quantidade de bytes necessária para armazenar o valor, e o segundo número especifica o número de dígitos a serem armazenados e mostrados após o ponto decimal (como com DECIMAL e NUMERIC). Quando é pedido ao MySQL para armazenar um número em uma coluna com mais digitos decimais após o ponto decimal que o especificado para esta coluna, o valor é arredondado eliminando os digitos extras quando armazenado."
Uma coisa que não vi você fazer é determinar a precisão do seu campo tipo FLOAT.
Meu conselho é usar no lugar do campo FLOAT o DECIMAL ou NUMERIC com precisão 2 ou 4 conforme o caso.
Por exemplo, as bombas de gasolina trabalham com precisão 4.
2) Para cálculos monetários no PHP considere usar a biblioteca BCMATH ( BCMath Funções Matemáticas de Precisão Arbitrária ) .
No manual do php http://www.php.net/manual/pt_BR/book.bc.php
Não vou explicar porque usar a bcmath, mas deixo um link com a explicação:
http://bordim.net.br/programacao/php-e-o-ponto-flutuante/
@buhlerax
Copy link

Créditos/Direitos autorais/(copyrigth): Alexandre Pereira Bühler
http://www.scriptcase.com.br/forum/index.php/topic,4114.msg16344.html#msg16344
Por favor dê os devidos créditos ou apague do github!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment