Spec-Zone.ru › MySQL 9.2

14.25.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.25.3, «Обработка выражений»).

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/precision-math-rounding.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API