SQL pirando ao somar Doubles
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.