ROUND: примеры (SQL)

Функция ROUND в MS SQL Server: руководство с примерами
Раздел: Математические функции, Математические
ROUND(numeric_expression, length [, function]): Same as input

Описание функции ROUND в MS SQL Server

Функция ROUND в MS SQL Server предназначена для округления числового значения до заданной точности. Ее применяют для форматирования числовых данных при выводе отчетов, в финансовых расчетах, где требуется определенное количество знаков после запятой, или для уменьшения точности вычислений в промежуточных результатах.

Синтаксис

ROUND ( numeric_expression , length [ ,function ] )

Аргументы

  • numeric_expression: Выражение, имеющее точный или приблизительный числовой тип данных (например, decimal, float, int, money). Не может быть типом bit.
  • length: Точность, до которой выполняется округление.
    • Если length — положительное целое число, округление выполняется до указанного количества десятичных знаков справа от запятой.
    • Если length — отрицательное целое число, округление выполняется слева от десятичной запятой (до десятков, сотен и т.д.).
    • Тип данных аргумента length должен быть tinyint, smallint или int.
  • function (необязательный): Тип выполняемой операции.
    • Если значение равно 0 или не указано, функция выполняет стандартное округление (по арифметическим правилам).
    • Если значение — любое число, не равное 0, функция выполняет усечение (TRUNCATE), просто отбрасывая цифры после указанной позиции без округления.

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

Функция возвращает значение того же типа, что и входное выражение numeric_expression. Исключения: выражения типов real и float возвращают результат типа float.

Базовые примеры использования ROUND

Различные варианты применения функции с разными параметрами.

Стандартное округление (по умолчанию)

SELECT ROUND(123.4567, 2) AS Example1;
Example1
123.4600

Округление до целого числа

SELECT ROUND(123.4567, 0) AS Example2;
Example2
123.0000

Округление до десятков (отрицательный параметр length)

SELECT ROUND(123.4567, -1) AS Example3;
Example3
120.0000

Усечение (TRUNCATE) с использованием третьего параметра

SELECT ROUND(123.4567, 2, 1) AS TruncateExample;
TruncateExample
123.4500
SELECT ROUND(123.4567, -1, 555) AS TruncateToTens;
TruncateToTens
120.0000

Похожие функции в MS SQL Server

  • CEILING(): Возвращает наименьшее целое число, большее или равное указанному выражению (округление вверх). Предпочтительна, когда требуется гарантированно округлить значение в большую сторону, например, при расчете количества упаковок.
  • FLOOR(): Возвращает наибольшее целое число, меньшее или равное указанному выражению (округление вниз). Используется, когда нужно гарантированно уменьшить число, например, для расчета целого периода.
  • FORMAT(): Позволяет форматировать числа, даты и строки. Для чисел может округлять и выводить результат в виде строки с учетом локали. Используется для финального отображения данных, а не для промежуточных вычислений, так как работает медленнее.

В отличие от ROUND, функции CEILING и FLOOR всегда возвращают целое число. FORMAT возвращает строковый тип данных.

Аналоги функции в других СУБД и языках

MySQL

Функция ROUND() имеет схожий синтаксис ROUND(X, D). Поведение аналогично.

-- MySQL
SELECT ROUND(123.4567, 2), ROUND(123.4567, -1);
123.46, 120

PostgreSQL

Функция ROUND() работает так же для типа numeric. Для double precision результат зависит от платформы из-за двоичного представления.

-- PostgreSQL
SELECT ROUND(123.4567::numeric, 2), ROUND(123.4567::numeric, -1);
123.46, 120

Oracle

Функция ROUND() аналогична, также применяется к датам для округления времени. Для усечения используется отдельная функция TRUNC().

-- Oracle
SELECT ROUND(123.4567, 2), ROUND(123.4567, -1), TRUNC(123.4567, 2) FROM DUAL;
123.46, 120, 123.45

SQLite

Функция ROUND(X, Y) присутствует. Если Y опущено, округление до целого.

Языки программирования (C# / .NET)

В .NET используется Math.Round(decimal, Int32, MidpointRounding). Ключевое отличие — наличие параметра для стратегии округления чисел посередине (например, MidpointRounding.AwayFromZero — к большему по модулю, MidpointRounding.ToEven — к ближайшему четному, банковское округление).

// C#
Math.Round(1.235m, 2); // 1.24 (по умолчанию ToEven)
Math.Round(1.235m, 2, MidpointRounding.AwayFromZero); // 1.24
Math.Round(1.225m, 2, MidpointRounding.ToEven); // 1.22

Распространенные ошибки и нюансы

Неявное преобразование типов и потеря точности

Округление чисел с плавающей точкой (float/real) может давать неожиданные результаты из-за их внутреннего двоичного представления.

SELECT ROUND(1.555, 2) as DecimalRound, ROUND(CAST(1.555 as float), 2) as FloatRound;
DecimalRound    FloatRound
1.555           1.55499994754791

Ожидание усечения при значении третьего параметра не равном 0

Любое ненулевое значение третьего аргумента приводит к усечению. Это может быть неочевидно.

SELECT ROUND(123.999, 1, 0) as RoundNormal, ROUND(123.999, 1, 10) as RoundTruncate;
RoundNormal    RoundTruncate
124.000       123.900

Округление отрицательных чисел

Правила округления применяются к абсолютному значению числа.

SELECT ROUND(-123.456, 1), ROUND(-123.456, -1);
-123.500    -120.000

История изменений функции

В последних версиях MS SQL Server (2012 и новее) не было внесено фундаментальных изменений в логику работы функции ROUND. Основное поведение и синтаксис остаются стабильными на протяжении многих версий. Единственное, что могло меняться, — это связанные с производительностью и интеграцией со средами CLR, но это не затрагивает базовый функционал.

Расширенные практические примеры

Использование в агрегатных функциях

Округление среднего значения в выборке.

Пример sql
SELECT AVG(ListPrice) as RawAvg, ROUND(AVG(ListPrice), 2) as RoundedAvg
FROM Production.Product
WHERE ListPrice > 0;
RawAvg        RoundedAvg
...           ...

Динамическое определение точности на основе значения

Точность округления может задаваться выражением.

Пример sql
DECLARE @Scale INT = 2;
SELECT ProductID, ROUND(Weight, @Scale) as RoundedWeight
FROM Production.Product;

Округление в выражении CASE для классификации

Категоризация цен после округления.

Пример sql
SELECT ProductID, ListPrice,
    CASE
        WHEN ROUND(ListPrice, -2) = 0 THEN 'Budget'
        WHEN ROUND(ListPrice, -2) <= 500 THEN 'Standard'
        ELSE 'Premium'
    END as PriceCategory
FROM Production.Product;

Финансовые расчеты: округление суммы платежа

Расчет ежемесячного платежа с точностью до 2 знаков.

Пример sql
DECLARE @Sum money = 15000, @Rate float = 0.12, @Term int = 24;
DECLARE @MonthlyPayment money;
SET @MonthlyPayment = @Sum * (@Rate/12) / (1 - POWER(1 + @Rate/12, -@Term));
SELECT @MonthlyPayment as Exact, ROUND(@MonthlyPayment, 2) as ForPayment;

Усечение времени (до минут) из даты-времени

Использование отрицательного параметра для округления чисел, представляющих дату (например, количество дней).

Пример sql
-- Округление количества дней до сотен
SELECT ROUND(DATEDIFF(day, '2020-01-01', '2023-05-15'), -2) as RoundedDaysDiff;
RoundedDaysDiff
1200

Работа с константами типа MONEY

Пример sql
SELECT ROUND($123.4567, 2), ROUND($123.4567, -1);
123.4600    $120.0000

MS SQL ROUND function comments

En
ROUND Returns a numeric value, rounded to the specified length or precision