# 12.25.4 舍入行为

本节讨论精度数学舍入圆形的()函数和 for 插入到具有精确值类型的列中 (十进制和整数)。

圆形的()函数根据其参数是精确的还是近似的而进行不同的舍入:

  • 对于精确值数字,圆形的()使用“四舍五入”规则:小数部分为 0.5 或更大的值如果为正则向上舍入到下一个整数,如果为负则向下舍入到下一个整数。(换句话说,它从零四舍五入。)小数部分小于 0.5 的值如果为正则向下舍入到下一个整数,如果为负则向上舍入到下一个整数。(换句话说,它朝零四舍五入。)

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

    以下示例显示了精确值和近似值的舍入有何不同:

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)

显示警告语句显示由于小数部分的舍入而由截断生成的注释。这种截断不是错误,即使在严格的 SQL 模式下(参见第 12.25.3 节,“表达式处理”)。