1

我有一个三列的表:

来源/目标/权重

x / y / 0.2

x / y / 0.2

z / a / 0.5

“重量”栏为“浮动”。我正在运行一个选择来对所有重复项进行分组并将“权重”分数加在一起。这是查询:

SELECT source, target, sum(weight) as weight2
FROM mytable
GROUP BY source, target

奇怪的是,在我运行查询之后,似乎“权重”部分中低于 1 的任何值(例如 0.2)都被四舍五入为 1。所以我得到下表:

来源/目标/权重

x / y / 2

z / a / 1

分数应该是 0.4 和 0.5。我究竟做错了什么?

4

1 回答 1

3

我刚刚在我的 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 手册中对这个问题进行更简短的处理:浮点值问题

于 2013-05-11T19:11:06.273 回答