
Do nada o meu produto que custava R$ 30,40 agora parece que custa R$ 30,399999. Pior ainda, a soma das notas fiscais não bate com a soma dos produtos! Olha meu SQL piradão:
create table Vendas (valor DOUBLE);
insert into Vendas (valor) values (13.20), (59.60), (30.40);
select sum(valor) from Vendas;
\> 103.1999999999
Que doideira é essa? Até eu não erro essa conta!
Mas eu preciso armazenar os números direito e o tipo double é uma aproximação! Aproximou,perdeu precisão.
Usei double pois o Mysql suporta ele, mas diversos bancos tem seu próprio tipo numérico aproximado. Por exemplo o SQL Server tem os tipos real e float, o Oracle tem seu mundo a parte que apresentamos em seu curso.
A solução? Dizer quantas casas desejamos para representar o valor e quantas casas decimais, então vamos usar o tipo DECIMAL. Dica bonus: deixe uma casa decimal de margem para arredondamentos:
create table Vendas (valor DECIMAL(10,3));
insert into Vendas (valor) values (13.20), (59.60), (30.40);
select sum(valor) from Vendas;
\> 103.200
Vai representar ponto flutuante?
Diga a escala e a precisão e siga o padrão SQL com o DECIMAL.
Essa dica é baseada no nosso curso básico de banco de dados relacionais, onde vemos outras situações onde a tipagem é fundamental para criar restrições no dia a dia como o uso de enumerações.
Avalie este artigo

Autor(a)
Guilherme Silveira
Co-fundador da Alura. Com mais de 20 anos de ensino de tecnologia, criou mais de 100 cursos. Possui formação em engenharia de software, viés matemático e criativo, além de ser medalhista de ouro em competições nacionais de computação, tendo representado o Brasil nos mundiais. Participante de comunidades open source e de educação em tecnologia, tendo escrito 7 livros. Faz mágica e fala coreano no tempo livre.
Inscreva-se em nossa Newsletter
Fique por dentro de conteúdos, insights e oportunidades do universo tech. Receba novidades e lançamentos direto no seu e-mail.


