舍入行为
本节讨论该ROUND()
函数以及具有精确值类型(DECIMAL
和整数)的列中的插入的精确数学舍入。
该ROUND()
函数根据其参数是精确的还是近似的取整方式不同:
- 对于精确值数字,请
ROUND()
使用“四舍五入”规则:如果分数为0.5或更大的分数,则将其向上舍入为下一个整数;如果为负,则舍入为下一个整数。(换句话说,四舍五入到零。)小数部分小于.5的值如果为正则四舍五入到下一个整数,如果为负则四舍五入到下一个整数。(换句话说,它四舍五入为零。) - 对于近似值数字,结果取决于C库。在许多系统上,这意味着
ROUND()
使用“四舍五入到最接近的偶数”规则:小数部分位于两个整数中间的一半的值将四舍五入到最接近的偶数整数。
以下示例显示了精确值和近似值的舍入差异:
mysql>SELECT ROUND(2.5), ROUND(25E-1); +------------ +-------------- + | ROUND(2.5) | ROUND(25E -1) | +------------ +-------------- + | 3 | 2 | +------------ +-------------- +
对于插入到a DECIMAL
或整数列中,目标是确切的数据类型,因此舍入使用“从零舍入一半”,而不考虑要插入的值是精确值还是近似值:
mysql>CREATE TABLE t (d DECIMAL(10,0)); Query OK, 0 rows affected (0.00 sec) mysql>INSERT INTO tVALUES (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 dFROM t; +------ + | d | +------ + | 3 | | 3 | +------ + 2 rows in set (0.00 sec)
该SHOW WARNINGS
语句显示由于舍入小数部分而通过截断生成的注释。即使在严格的SQL模式下,这种截断也不是错误(请参见“表达式处理”)。