SQL pirando ao somar Doubles
![SQL pirando ao somar Doubles](https://www.alura.com.br/artigos/assets/code/sql-double-e-decimal-pirando-ao-somar-2-2-5.1722031060.png)
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!
![Banner da Escola de Data Science: Matricula-se na escola de Data Science. Junte-se a uma comunidade de mais de 500 mil estudantes. Na Alura você tem acesso a todos os cursos em uma única assinatura; tem novos lançamentos a cada semana; desafios práticos. Clique e saiba mais!](assets/alura-matricula-maior-escola-tecnologia-brasil-mais-500-mil-estudantes/matricula-escola-data-science-alura-saiba-mais-versao-mobile.png)
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.