Weired Поведение функции Round в базе данных MSSQL только для столбца Real - PullRequest
0 голосов
/ 05 сентября 2018

Я обнаружил странное или странное поведение функции Round в MSSQL для реального типа столбца. Я проверял эту проблему в Azure SQL DB и SQL Server 2012

Почему @ номер = 201604.125 Возврат 201604.1?

Почему раунд (1.12345,10) Возврат 1.1234500408?

-- For Float column it working as expected
-- Declare @number as float,@number1 as float;
    Declare @number as real,@number1 as real;
set @number=201604.125;
set @number1=1.12345;
select @number as Realcolumn_Original
,round(@number,2) as Realcolumn_ROUND_2
,round(@number,3) as Realcolumn_ROUND_3
, @number1 as Realcolumn1_Original

,round(@number1,6) as Realcolumn1_ROUND_6
,round(@number1,7) as Realcolumn1_ROUND_7
,round(@number1,8) as Realcolumn1_ROUND_8
,round(@number1,9) as Realcolumn1_ROUND_9
,round(@number1,10) as Realcolumn1_ROUND_10

Вывод для реального типа столбца enter image description here

1 Ответ

0 голосов
/ 05 сентября 2018

I подозреваемый что вы спрашиваете здесь, почему:

DECLARE @n real = 201604.125;
SELECT @n;

Возврат 201604.1?

Первой точкой вызова для подобных вещей должна стать документация: давайте начнем с float и real (Transact-SQL) . Сначала отметим, что:

ISO-синонимом real является float(24).

Если мы посмотрим дальше вниз:

float [(n)] где n - количество битов, которые используются для хранения мантисса числа с плавающей точкой в ​​научной записи и, следовательно, диктует точность и размер хранилища. Если указано n, оно должно быть значение от 1 до 53. Значением по умолчанию для n является 53. Значение n

Precision Storage size

1-24 7 digits 4 bytes

Итак, теперь мы знаем, что real (он же float(24)) имеет точность 7. 201604.125 имеет точность 9, это 2 слишком много; так что давай 2 и 5 в возвращаемом значении.

Теперь ROUND (Transact-SQL) . Это заявляет:

Возвращает числовое значение, округленное до указанной длины или точности.

При использовании real / float эти цифры фактически не теряются как таковые из-за плавающей запятой. Когда вы используете ROUND, вы конкретно указываете: «Я хочу столько десятичных разрядов». Вот почему вы можете увидеть .13 и .125, как вы специально просили их. Когда вы только что вернули значение @number, оно имело точность 7, поскольку оно было real, поэтому 201604.1 было возвращенным значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...