Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Rounding Behavior

14.24.4 舍入行为

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

ROUND() 函数根据其参数是精确的还是近似的进行舍入:

  • 对于精确值数字, ROUND() 使用“舍入半上”规则:小数部分为 .5 或更高的值将被舍入到下一个整数,如果为正数,或者舍入到上一个整数,如果为负数。(换言之,它是远离零舍入的。)小数部分小于 .5 的值将被舍入到下一个整数,如果为正数,或者舍入到上一个整数,如果为负数。(换言之,它是朝向零舍入的。)

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

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

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

对于插入到 DECIMAL 或整数列,目标是一个精确的数据类型,因此舍入使用“舍入半远离零”,无论要插入的值是精确的还是近似的:

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 模式下(见 第 14.24.3 节,“表达式处理”)。