Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Изменение поведения функции round()  [new]
rozen
Member

Откуда:
Сообщений: 41
Неожиданно для себя обнаружил, что при изменении compatibility level базы данных с 2014 на 2016 изменилось поведение round, а так же и конвертации типов float -> decimal

На уровне совместимости 2014 select round(cast(0.41595 as float), 4) возвращал значение 0.416
После подъема уровня совместимости на 2016 возвращается 0.4159

Прогнал числа из теста, описанного в документации по .NET по методу Math.Round, иллюстрирующего "бухгалтерское округление". Нет, вроде не это.

P.S. Да, я знаю, что "не надо так делать", но так сложилось, что есть взаимодействие с базой, где количества хранятся во float.
24 май 18, 08:36    [21434725]     Ответить | Цитировать Сообщить модератору
 Re: Изменение поведения функции round()  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20538
Да не делает сервер это округление сам - оно ему надо? он обращается к какой-то библиотеке (С++ runtime), которая сделает ему округление - а вот она-то как раз и поменялась...

Если Вы хотите получить округление, которое не зависит от погоды на Марсе - реализуйте его "вручную".
24 май 18, 08:41    [21434735]     Ответить | Цитировать Сообщить модератору
 Re: Изменение поведения функции round()  [new]
rozen
Member

Откуда:
Сообщений: 41
Я хочу, чтобы изменения в поведении функций документировались.

Тем более, что речь идёт об одном и том же сервере и одной и той же БД, у которой можно опцию compatibility level попереключать туда-сюда. Эта конвертация не поменяла своего поведения даже при переходе с реального сервера SQL 2000 на реальный сервер SQL 2005. Это называется "обратная совместимость".
А тут вдруг просто при смене compatibility level 2014-2016 в рамках одного и того же 2016 сервера.
24 май 18, 08:50    [21434749]     Ответить | Цитировать Сообщить модератору
 Re: Изменение поведения функции round()  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20538
rozen
Я хочу, чтобы изменения в поведении функций документировались.
Это - к разработчику. Сейчас поведение функции ROUND() в части используемого типа округления в принципе не документировано. Так что реализацию стабильности типа округления и риски от его изменения в стандартной реализации они спихнули на конечного пользователя...
24 май 18, 08:56    [21434761]     Ответить | Цитировать Сообщить модератору
 Re: Изменение поведения функции round()  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
rozen
Я хочу, чтобы изменения в поведении функций документировались.

Тем более, что речь идёт об одном и том же сервере и одной и той же БД, у которой можно опцию compatibility level попереключать туда-сюда. Эта конвертация не поменяла своего поведения даже при переходе с реального сервера SQL 2000 на реальный сервер SQL 2005. Это называется "обратная совместимость".
А тут вдруг просто при смене compatibility level 2014-2016 в рамках одного и того же 2016 сервера.

у какой.
вот всё тебе описано

https://docs.microsoft.com/en-us/sql/t-sql/data-types/float-and-real-transact-sql?view=sql-server-2017
автор
Approximate-number data types for use with floating point numeric data. Floating point data is approximate; therefore, not all values in the data type range can be represented exactly. The ISO synonym for real is float(24).

https://technet.microsoft.com/en-us/library/dd424925.aspx
автор
Note that the decimal and numeric data types are exactly equivalent to each other. Both data types are kept in the product for backwards compatibility. Either data type can be used when you need to store exact numeric data with decimal places, however, it is recommended that you choose either decimal or numeric for use throughout your organization for consistency.
24 май 18, 09:04    [21434770]     Ответить | Цитировать Сообщить модератору
 Re: Изменение поведения функции round()  [new]
aleks222
Member

Откуда:
Сообщений: 985
rozen
Я хочу, чтобы изменения в поведении функций документировались.

Тем более, что речь идёт об одном и том же сервере и одной и той же БД, у которой можно опцию compatibility level попереключать туда-сюда. Эта конвертация не поменяла своего поведения даже при переходе с реального сервера SQL 2000 на реальный сервер SQL 2005. Это называется "обратная совместимость".
А тут вдруг просто при смене compatibility level 2014-2016 в рамках одного и того же 2016 сервера.


Хорошо бы увидеть cast( ваше_поле as varbinary(16) ) для этих двух случаев.
24 май 18, 09:52    [21434949]     Ответить | Цитировать Сообщить модератору
 Re: Изменение поведения функции round()  [new]
rozen
Member

Откуда:
Сообщений: 41
aleks222
Хорошо бы увидеть cast( ваше_поле as varbinary(16) ) для этих двух случаев.


И там и там 0x3FDA9EECBFB15B57
25 май 18, 09:52    [21439046]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить