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.


Tech Education Leader no Alura

Próximo ArtigoValores válidos para variáveis em Java