Arredondando no MySQL
Publicado em 20/02/2012 às 23:58:57 horas.
Uma dúvida bastante comum entre as pessoas que estão iniciando os seus estudos em bancos de dados e começando a manipular na prática o SQL é a respeito da formatação de números decimais. Esta dúvida está relacionada também, na maioria dos casos, com a utilização dos tipos de dados double e float, mas pode ocorrer também em outras circunstâncias.
Algumas contas matemáticas podem gerar dízimas periódicas, como por exemplo a operação de divisão do número 5 pelo número 3:
SELECT 5/3;
# Resultado: 1.6667
Operações de multiplicação também podem gerar números decimais ou resultados como por exemplo: ao multiplicar 1000 por 1.5, o resultado é de 1500, mas em algumas situações o MySQL pode apresentar o número em diferentes versões: 1500.0000, 1500.00001, etc. Isto ocorre pois o servidor de banco de dados em questão, ao realizar estas contas, não leva em consideração quantas casas decimais havia no número original utilizado na operação para formatar o resultado final, sendo necessário, neste caso, formatar o número manualmente, ou adequar a coluna da tabela que receberá este valor para suportar no máximo o número de casas decimais desejado pelo programador.
Para tratar adequadamente a formatação destes valores, é possível utilizar a função ROUND disponível no MySQL. Esta função recebe dois parâmetros: o primeiro deles é o número a ser formatado, e o segundo é o número de casas decimais que o usuário deseja que o valor apresente. Na omissão do segundo parâmetro, o comando arredonda o valor para um inteiro (sem casas decimais).
Alguns exemplos de utilização da função ROUND:
SELECT ROUND(1.6667);
# Arredonda para não utilizar casas decimais
SELECT ROUND(1.6667, 1);
# Resultado: 1.7
# Arredonda para uma casa decimal
SELECT ROUND(1.6667, 2);
# Resultado: 1.67
# Arredonda para duas casas decimais
Observe que ao arredondar um valor, o comando ROUND não apenas exibe o número de casas decimais informado, mas também arredonda a última casa decimal em questão para cima ou para baixo dependendo do valor decimal da próxima casa. Por exemplo:
SELECT ROUND(1.6667, 3);
# Resultado: 1.667
# Casas decimais 3 e 4: 67 está mais próximo de 70 do que de 60
SELECT ROUND(1.6664, 3);
# Resultado: 1.666
# Casas decimais 3 e 4: 64 está mais próximo de 60 do que de 70
Quando usar: na instrução UPDATE ou SELECT?
Quando devemos utilizar o comando ROUND? Podemos utilizá-lo em dois momentos distintos. O primeiro deles seria na instrução UPDATE que irá atualizar seus dados, como por exemplo:
UPDATE TABELA SET CAMPO = ROUND(...);
Desta forma já seria armazenado na tabela em questão o valor resultante da operação devidamente formatado. A outra forma seria não armazenar o valor formatado, e sim formatá-lo no momento que o mesmo fosse capturado pela instrução SELECT:
SELECT ROUND(CAMPO, 2) FROM TABELA;
Não existe uma forma certa ou errada de utilizar este comando, pois isto vai depender das especificações do seu projeto. Se for interessante para o seu sistema armazenar o valor sem o arredondamento (o arredondamento pode influenciar o resultado em operações futuras), o recomendado é armazená-lo sem arredondamento. Caso contrário, você poderá utilizar o comando de formatação logo na instrução UPDATE sem maiores preocupações,