Функция ROUND

Рассмотрим такую задачу.

Посчитать средний размер жесткого диска ПК. Результат представить с двумя знаками после десятичной точки.

Выполнив запрос

select AVG(hd) as avg_hd from pc;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
мы получим такой результат:

avg_hd
13.6667

Чтобы выполнить требуемое округление можно воспользоваться функцией ROUND:

select round(AVG(hd),2) as avg_hd from pc;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
avg_hd
13.67

Второй аргумент этой функции как раз указывает число десятичных знаков результата.

Как видно, результат был округлен по арифметическим правилам. Однако у функции ROUND есть третий необязательный аргумент, который говорит о том, округлять ли результат (значение 0 - принимается по умолчанию) или отбрасывать цифры сверх удерживаемых (ненулевое значение).

Т.е. если мы перепишем наш запрос так:

select round(AVG(hd),2,1) as avg_hd from pc;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
то получим другой результат:

avg_hd
13.66

Кстати, округлять можно до любого знака, не только десятичного. Например, чтобы округлять до десятков, сотен и т.д., используются отрицательные значения второго аргумента. Следующий запрос округляет результат до десятков.

select round(AVG(hd),-1) as avg_hd from pc;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
avg_hd
10

Следует отметить, что функция ROUND выполняет округление, но не меняет тип результата. Т.е. если аргумент будет иметь тип dec(12,6), то и результат округления будет того же типа, а именно,

avg_hd
13.67

В этом легко убедиться, выполнив запрос

select round(cast(AVG(hd) as dec(12,6)),2) as avg_hd from pc;

Поэтому, если вы хотите избавиться от хвостовых нулей, используйте преобразование к нужному вам типу, например, dec(12,2). Тогда нам и функция ROUND не потребуется. :-)

select cast(AVG(hd) as DEC(12,2)) as avg_hd from pc;
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]