ROUND: примеры (SQL)
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, но это не затрагивает базовый функционал.
Расширенные практические примеры
Использование в агрегатных функциях
Округление среднего значения в выборке.
SELECT AVG(ListPrice) as RawAvg, ROUND(AVG(ListPrice), 2) as RoundedAvg
FROM Production.Product
WHERE ListPrice > 0;RawAvg RoundedAvg ... ...
Динамическое определение точности на основе значения
Точность округления может задаваться выражением.
DECLARE @Scale INT = 2;
SELECT ProductID, ROUND(Weight, @Scale) as RoundedWeight
FROM Production.Product;Округление в выражении CASE для классификации
Категоризация цен после округления.
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 знаков.
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;Усечение времени (до минут) из даты-времени
Использование отрицательного параметра для округления чисел, представляющих дату (например, количество дней).
-- Округление количества дней до сотен
SELECT ROUND(DATEDIFF(day, '2020-01-01', '2023-05-15'), -2) as RoundedDaysDiff;RoundedDaysDiff 1200
Работа с константами типа MONEY
SELECT ROUND($123.4567, 2), ROUND($123.4567, -1);123.4600 $120.0000