Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Quantidade exagerada de casas decimais

Ao realizar a soma da coluna "valor", conforme a aula, o resultado apresentado pelo MySQL é, no mínimo, esquisito.

vejam

mysql> select sum(valor) from compras;
+-------------------+
| sum(valor)        |
+-------------------+
| 77356.82999999999 |
+-------------------+
1 row in set (0.00 sec)

Esta é a descrição da tabela:

mysql> desc compras;
+-------------+------------------------------------+------+-----+---------+----------------+
| Field       | Type                               | Null | Key | Default | Extra          |
+-------------+------------------------------------+------+-----+---------+----------------+
| id          | int(11)                            | NO   | PRI | NULL    | auto_increment |
| valor       | double                             | NO   |     | NULL    |                |
| data        | date                               | NO   |     | NULL    |                |
| observacoes | varchar(255)                       | NO   |     | NULL    |                |
| recebido    | tinyint(1)                         | YES  |     | 0       |                |
| forma_pagt  | enum('cartao','boleto','dinheiro') | YES  |     | NULL    |                |
+-------------+------------------------------------+------+-----+---------+----------------+

Não era para ter apenas duas casas decimais? O que está havendo?

Obrigado!

1 resposta
solução!

Olá Humberto tudo bem?

Isso ocorre devido a um erro de ponto flutuante, o tipo double é um tipo de valor flutuante e por isso que isso ocorre.

Deixa eu explicar.

O tipo de valor ponto flutuante é um número com valor aproximado guardado em binário no banco de dados. Mais informações https://pt.wikipedia.org/wiki/V%C3%ADrgula_flutuante

Acontece que na hora de converter de binário para decimal há alguns arredondamentos que acabam causando algumas bizarrices.

Se quer uma precisão de duas casas decimais você tem que usar o decimal que é um tipo de ponto flutuante fixo ou seja você consegue controlar a sua precisão. Mais informações https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html

Espero ter ajudado!!!