MySQL舍入行为不能按预期工作..?

时间:2017-11-07 13:53:00

标签: mysql floating-point rounding precision

可以找到MySQL舍入行为术语here.。 他们承诺,近似(FLOAT,DOUBLE)值的舍入将为HALF_EVEN。但是当尝试相同的时候,我无法生成文件中所说的内容。它显然适用于DOUBLE数据类型的HALF_UP。这里有什么我想念的吗??

CREATE TABLE `doubleValues` (
  `val` double DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

select* from doubleValues;
+-------+
| val   |
+-------+
| 1.245 |
| 0.555 |
+-------+

select round(val,2) from doubleValues;
+--------------+
| round(val,2) |
+--------------+
|         1.25 |
|         0.56 |
+--------------+
2 rows in set (0.00 sec)

2 个答案:

答案 0 :(得分:2)

从您将请求链接到的文档:

  
    

对于近似值数字,结果取决于C库。在许多系统上,这意味着ROUND()使用“round to nearest even”规则:具有任何小数部分的值四舍五入为最接近的偶数整数。

  

换句话说:舍入方法未定义。

无论如何:为什么要使用近似类型?你需要那么多数字的数字吗?我很难想象数据库会出现这种情况。一些天文数据库也许。

答案 1 :(得分:2)

二进制浮点数中不存在数字1.245和0.555;它们并不完全可以代表。您所看到的“1.245”和“0.555”可能是1.24500000000000010658141036401502788066864013671875和0.55500000000000004884981308350688777863979339599609375。这些是64位二进制IEEE-754浮点中最接近1.245和0.555的值。 (虽然用十进制表示它们很长,但它们的二进制表示很短。)

当它们四舍五入到两个小数点时,必须舍入的部分在舍入位置略高于½。第一个是.500000000000010658141036401502788066864013671875,第二个是.500000000000004884981308350688777863979339599609375。因此,关于如何舍入恰好为1/2的分数时要做什么的规则不起作用。这些都是½以上,所以它们被四舍五入。