在FLOAT数据上使用SUM

Ema*_*sev 21 mysql

一张桌子:
物品(id,价格)

有一行:
id:1,价格:565.8

SELECT price FROM items给出565.8
SELECT SUM(price) FROM items给予565.799987792969而不是565.8我期望的.

565.799987792969来自哪里?

Lit*_*les 21

我不确定您使用的是哪个版本,但听起来这个链接描述了您正在体验的内容.

从链接:

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.
Run Code Online (Sandbox Code Playgroud)

浮点数存储为近似值; 如果要存储价格,最好使用存储精确值的十进制数据类型.


Eug*_*ash 10

您可以使用ROUNDFORMAT函数:

SELECT ROUND(SUM(price), 2) FROM items;
Run Code Online (Sandbox Code Playgroud)

或者,您可以在定义列时指定精度,例如FLOAT(5,2).