我有一个三列的表:
来源/目标/权重
x/y/0.2
x/y/0.2
z/a/0.5
"weight"列为"float"。我正在运行一个选择组所有的重复和添加"权重"分数在一起。下面是查询:
SELECT source, target, sum(weight) as weight2
FROM mytable
GROUP BY source, target
奇怪的是,在我运行查询之后,似乎在"权重"部分(例如0.2)中低于1的任何值都被舍入为1。所以我得到了下面的表:
来源/目标/权重
x/y/2
z/a/1
分数应该是0.4和0.5。我做错了什么?
我刚刚在MySQL 5.5.30实例上运行了这个:
mysql> create table mytable (source char(1), target char(1), weight float);
mysql> insert into mytable values
-> ('x','y',0.2),
-> ('x','y',0.2),
-> ('z','a',0.5);
mysql> SELECT source, target, sum(weight) as weight2
-> FROM mytable
-> GROUP BY source, target;
+--------+--------+--------------------+
| source | target | weight2 |
+--------+--------+--------------------+
| x | y | 0.4000000059604645 |
| z | a | 0.5 |
+--------+--------+--------------------+
MySQL不会像你描述的那样四舍五入到1。我所能猜到的是,您在插入值时对它们进行了四舍五入。我建议仔细检查数据,而不使用 SUM()或GROUP BY,以查看值是什么。
您可能注意到,在上面的输出中,第一行的SUM并不完全是0.4,而是一个接近 0.4的浮点值。如果担心舍入误差,可能不应该使用FLOAT。
阅读David Goldberg的《每个计算机科学家都应该知道的浮点算术》。
或者在MySQL手册中对这个问题的简短处理:浮点值问题。