Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Rounding Behavior

14.24.4 舍入行为

本节讨论了舍入数学舍入行为对于ROUND()函数和将精确值类型列插入的舍入行为(DECIMAL和整数)。

舍入函数ROUND()根据其参数是否为精确或近似值而进行舍入:

  • 对于精确值数字,ROUND()使用“舍入半上”规则:具有小数部分为0.5或更高的值将被舍入到下一个整数,如果为正则向上舍入,如果为负则向下舍入。在其他情况下,即舍入远离零。具有小数部分小于0.5的值将被舍入到下一个整数,如果为正则向下舍入,如果为负则向上舍入。在其他情况下,即舍入向零。

  • 对于近似值数字,结果取决于C库。在许多系统中,这意味着ROUND()使用“舍入到最近偶数”规则:具有小数部分恰好在两个整数之间的值将被舍入到最近的偶数整数。

以下示例展示了舍入精确和近似值的差异:

mysql> SELECT ROUND(2.5), ROUND(25E-1);
+------------+--------------+
| ROUND(2.5) | ROUND(25E-1) |
+------------+--------------+
| 3          |            2 |
+------------+--------------+

将精确值类型或整数列插入时,目标是一个精确数据类型,因此舍入使用“舍入远离零”,无论插入的值是否为精确或近似:

mysql> CREATE TABLE t (d DECIMAL(10,0));
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO t VALUES(2.5),(2.5E0);
Query OK, 2 rows affected, 2 warnings (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 2

mysql> SHOW WARNINGS;
+-------+------+----------------------------------------+
| Level | Code | Message                                |
+-------+------+----------------------------------------+
| Note  | 1265 | Data truncated for column 'd' at row 1 |
| Note  | 1265 | Data truncated for column 'd' at row 2 |
+-------+------+----------------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT d FROM t;
+------+
| d    |
+------+
|    3 |
|    3 |
+------+
2 rows in set (0.00 sec)

SHOW WARNINGS语句显示由舍入小数部分的截断生成的注释。这种截断不是错误,即使在严格SQL模式下(见Section 14.24.3, “Expression Handling”)。