MySQL 8.3 Release Notes
本节讨论精度数学舍入对于 ROUND()
函数和插入到精确值类型列(DECIMAL
和整数)的行为。
ROUND()
函数根据其参数是精确的还是近似的进行舍入:
以下示例显示了精确值和近似值的舍入差异:
Press CTRL+C to copymysql> SELECT ROUND(2.5), ROUND(25E-1); +------------+--------------+ | ROUND(2.5) | ROUND(25E-1) | +------------+--------------+ | 3 | 2 | +------------+--------------+
对于插入到 DECIMAL
或整数列,目标是一个精确的数据类型,因此舍入使用“舍入半远离零”,无论要插入的值是精确的还是近似的:
Press CTRL+C to copymysql> 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 节,“表达式处理”)。