添加带小数的数字会在MySQL中返回舍入的数字

时间:2013-05-11 19:01:48

标签: mysql

我有一个包含三列的表:

来源/目标/体重

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。我做错了什么?

1 个答案:

答案 0 :(得分: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并没有像你描述的那样进行四舍五入。我可以猜到的是,在插入值时会将值四舍五入。我建议仔细检查数据,不要执行SUM()或GROUP BY,以查看值是什么。

您可能会注意到,在上面的输出中,第一行的SUM不完全是0.4,而是它的浮点值接近 0.4。如果您担心舍入错误,则可能不应该使用FLOAT。

阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic, by David Goldberg
或者在MySQL手册中对此问题进行较短的处理:Problems with Floating-Point Values