SQL pirando ao somar Doubles

SQL pirando ao somar Doubles
Guilherme Silveira
Guilherme Silveira

Compartilhe

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.

Guilherme Silveira
Guilherme Silveira

Co-fundador da Alura, da Caelum e do GUJ. Com 18 anos de ensino nas áreas de programação e dados, 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.

Veja outros artigos sobre Data Science