12.21.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 |
+------------+--------------+
При вставке данных в столбец типа 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 (см. Раздел 12.21.3, «Обработка выражений»).
© 2025 Oracle
Licensed under the GPLv2 License.