Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Изменение поведения функции round() / 7 сообщений из 7, страница 1 из 1
24.05.2018, 08:36
    #39649135
rozen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение поведения функции round()
Неожиданно для себя обнаружил, что при изменении 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.
...
Рейтинг: 0 / 0
24.05.2018, 08:41
    #39649137
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение поведения функции round()
Да не делает сервер это округление сам - оно ему надо? он обращается к какой-то библиотеке (С++ runtime), которая сделает ему округление - а вот она-то как раз и поменялась...

Если Вы хотите получить округление, которое не зависит от погоды на Марсе - реализуйте его "вручную".
...
Рейтинг: 0 / 0
24.05.2018, 08:50
    #39649143
rozen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение поведения функции round()
Я хочу, чтобы изменения в поведении функций документировались.

Тем более, что речь идёт об одном и том же сервере и одной и той же БД, у которой можно опцию compatibility level попереключать туда-сюда. Эта конвертация не поменяла своего поведения даже при переходе с реального сервера SQL 2000 на реальный сервер SQL 2005. Это называется "обратная совместимость".
А тут вдруг просто при смене compatibility level 2014-2016 в рамках одного и того же 2016 сервера.
...
Рейтинг: 0 / 0
24.05.2018, 08:56
    #39649144
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение поведения функции round()
rozenЯ хочу, чтобы изменения в поведении функций документировались.Это - к разработчику. Сейчас поведение функции ROUND() в части используемого типа округления в принципе не документировано. Так что реализацию стабильности типа округления и риски от его изменения в стандартной реализации они спихнули на конечного пользователя...
...
Рейтинг: 0 / 0
24.05.2018, 09:04
    #39649148
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение поведения функции round()
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.
...
Рейтинг: 0 / 0
24.05.2018, 09:52
    #39649181
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение поведения функции round()
rozenЯ хочу, чтобы изменения в поведении функций документировались.

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

Хорошо бы увидеть cast( ваше_поле as varbinary(16) ) для этих двух случаев.
...
Рейтинг: 0 / 0
25.05.2018, 09:52
    #39649697
rozen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Изменение поведения функции round()
aleks222Хорошо бы увидеть cast( ваше_поле as varbinary(16) ) для этих двух случаев.

И там и там 0x3FDA9EECBFB15B57
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Изменение поведения функции round() / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]