Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Problemy z porównywaniem liczb zmiennoprzecinkowych MySQL

Czy zauważyłeś poniższy problem?

CREATE TABLE a (num float);

INSERT INTO a VALUES (50.12);
INSERT INTO a VALUES (34.57);
INSERT INTO a VALUES (12.75);
INSERT INTO a VALUES (11.22);
INSERT INTO a VALUES (10.46);
INSERT INTO a VALUES (9.35);
INSERT INTO a VALUES (8.55);
INSERT INTO a VALUES (7.23);
INSERT INTO a VALUES (6.53);
INSERT INTO a VALUES (5.15);
INSERT INTO a VALUES (4.01);

SELECT SUM(num) FROM a;
+-----------------+
| SUM(num)        |
+-----------------+
| 159.94000005722 | 
+-----------------+

Jest dodatkowy 0.00000005722 rozłożone między niektórymi z tych rzędów. Dlatego niektóre z tych wartości zwrócą false w porównaniu z wartością, którą zostały zainicjowane.

Aby uniknąć problemów z arytmetykami zmiennoprzecinkowymi i porównaniami, powinieneś użyć DECIMAL typ danych:

ALTER TABLE a MODIFY num DECIMAL(6,2);

SELECT SUM(num) FROM a;
+----------+
| SUM(num) |
+----------+
|   159.94 | 
+----------+
1 row in set (0.00 sec)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Samouczek dotyczący tworzenia kopii zapasowych i przywracania (eksportowania i importowania) baz danych MySQL

  2. Wyłącz logowanie root w phpMyAdmin

  3. Usuń z dołączeniem w MySQL

  4. Ściągawka w formacie daty MySQL

  5. odpowiednik generate_series() w MySQL