MySQL round(x,1) 返回 0.0 和 -0.0。

3
告诉我这两个零是否有意义:
select x, count(1) from (select round(rand()-0.5,1) x from tab) t group by x;
+------+----------+
| x    | count(1) |
+------+----------+
| -0.5 |     1830 |
| -0.4 |     3726 |
| -0.3 |     3753 |
| -0.2 |     3835 |
| -0.1 |     3828 |
|  0.0 |     1909 |
| -0.0 |     1889 |
|  0.1 |     3831 |
|  0.2 |     3753 |
|  0.3 |     3793 |
|  0.4 |     3690 |
|  0.5 |     1887 |
+------+----------+

有一种解决方法(将其转换为decimal(10,1)),但我很好奇round()是否出了问题。我正在使用MySQL 5.1。

1个回答

7
IEEE浮点标准有两个零:正零和负零。当将负值四舍五入到0时,round()返回负零是完全正常的。
通常情况下,负零被视为等于正零,但是在您的平台上,MySQL似乎认为它们是不同的。
更新:MySQL至少在5.5中似乎认为正零和负零对于“=”相等,但对于“GROUP BY”不同。
您可以将零添加到值中,以将负零转换为正零,而对其他值没有影响。例如,
select x, count(1) from (select 0+round(rand()-0.5,1) x from tab) t group by x;

谢谢!您认为这是应该修复的MySQL错误吗? - iggy
很难说,有时候两个零相等,有时候不相等,这确实令人惊讶。你可以尝试提交一个错误报告,看看他们会说什么。 - Joni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接