Подтвердить что ты не робот

Использование SUM для данных FLOAT

Одна таблица:
пункты (id, цена)

Есть одна строка:
id: 1, цена: 565.8

SELECT price FROM items дает 565.8
SELECT SUM(price) FROM items дает 565.799987792969 вместо 565.8, который я ожидаю.

Откуда 565.799987792969?

4b9b3361

Ответ 1

Я не уверен, какую версию вы используете, но это звучит как эта ссылка описывает то, что вы испытываете.

Из ссылки:

mysql> select * from aaa;
+----+------------+------+
| id | month_year | cost |
+----+------------+------+
|  1 | 2002-05-01 | 0.01 |
|  2 | 2002-06-01 | 1.65 |
|  3 | 2002-07-01 | 0.01 |
|  4 | 2002-01-01 | 0.01 |
+----+------------+------+

mysql> select id, sum(cost) from aaa group by id;
+----+---------------------+
| id | sum(cost)           |
+----+---------------------+
|  1 | 0.00999999977648258 |
|  2 |    1.64999997615814 |
|  3 | 0.00999999977648258 |
|  4 | 0.00999999977648258 |
+----+---------------------+

The SUM function changes 0.01 to 0.00999999977648258.

Числа с плавающей запятой сохраняются как приблизительные значения; если вы храните цену, вам лучше использовать десятичный тип данных, который хранит точные значения.

Ответ 2

Вы можете использовать ROUND или FORMAT:

SELECT ROUND(SUM(price), 2) FROM items;

В качестве альтернативы вы можете указать точность при определении столбца, например. FLOAT(5,2).