Перейти к содержимому
Последнее обновление

ROUND_BANKERS

Описание​

Округляет x методом банковского округления, сохраняя d знаков после десятичной точки. Значение d по умолчанию равно 0.

Если d отрицательно, |d| цифр слева от десятичной точки заменяются на 0.

Если x или d равны null, возвращает null.

Если d задан столбцом, а первый параметр имеет тип Decimal, то результат типа Decimal будет содержать столько же знаков после десятичной точки, сколько входное значение Decimal.

Согласно правилам алгоритма банковского округления, при округлении до заданного десятичного разряда:

  • Если отбрасываемая цифра равна 5 и после неё нет других ненулевых цифр, проверяется непосредственно предшествующая ей цифра:

    • Если предшествующая цифра чётная, 5 просто отбрасывается.
    • Если предшествующая цифра нечётная, число округляется вверх.
  • Если отбрасываемая цифра больше 5 или после неё есть ненулевые цифры, применяются обычные правила округления: если цифра больше или равна 5, число округляется вверх, в противном случае округляется вниз.

Например:

  • Для значения 2.5 цифра 2 перед 5 чётная, поэтому результат округления равен 2.

  • Для значения 3.5 цифра 3 перед 5 нечётная, поэтому результат округления равен 4.

  • Для значения 2.51 цифра после 5 не равна 0, поэтому число сразу округляется вверх, и результат равен 3.

Синтаксис​

ROUND_BANKERS(<x> [ , <d>])

Параметры​

ПараметрОписание
<x>Число для округления
<d>Необязательный параметр, задающий количество знаков после десятичной точки, до которого выполняется округление. Значение по умолчанию равно 0.

Возвращаемое значение​

Возвращает целое число или число с плавающей точкой:

  • По умолчанию, когда параметр d = 0, возвращает целое число, полученное округлением x по алгоритму банковского округления.

  • Если d отрицательно, возвращает целое число, у которого первая цифра слева от десятичной точки равна 0.

  • Если и x, и d равны NULL, возвращает NULL.

  • Если d задан столбцом, а x имеет тип Decimal, возвращает число с плавающей точкой с той же точностью.

Пример​

select round_bankers(0.4);
+--------------------+
| round_bankers(0.4) |
+--------------------+
| 0 |
+--------------------+
select round_bankers(-3.5);
+---------------------+
| round_bankers(-3.5) |
+---------------------+
| -4 |
+---------------------+
select round_bankers(-3.4);
+---------------------+
| round_bankers(-3.4) |
+---------------------+
| -3 |
+---------------------+
select round_bankers(10.755, 2);
+--------------------------+
| round_bankers(10.755, 2) |
+--------------------------+
| 10.76 |
+--------------------------+
select round_bankers(10.745, 2);
+--------------------------+
| round_bankers(10.745, 2) |
+--------------------------+
| 10.74 |
+--------------------------+
select round_bankers(1667.2725, -2);
+------------------------------+
| round_bankers(1667.2725, -2) |
+------------------------------+
| 1700 |
+------------------------------+
SELECT number
, round_bankers(number * 2.5, number - 1) AS rb_decimal_column
, round_bankers(number * 2.5, 0) AS rb_decimal_literal
, round_bankers(cast(number * 2.5 AS DOUBLE), number - 1) AS rb_double_column
, round_bankers(cast(number * 2.5 AS DOUBLE), 0) AS rb_double_literal
FROM test_enhanced_round
WHERE rid = 1;
+--------+-------------------+--------------------+------------------+-------------------+
| number | rb_decimal_column | rb_decimal_literal | rb_double_column | rb_double_literal |
+--------+-------------------+--------------------+------------------+-------------------+
| 1 | 2.0 | 2 | 2 | 2 |
+--------+-------------------+--------------------+------------------+-------------------+