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

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

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

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

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

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


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