可以找到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)
答案 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的分数时要做什么的规则不起作用。这些都是½以上,所以它们被四舍五入。