Версия RTM для SQL Server не округляется - PullRequest
1 голос
/ 07 ноября 2019

Я загрузил свой продукт в Azure и SQL Server, но обнаружил действительно интересную проблему при работе с Azure. По умолчанию Azure предоставляет RTM-версию SQL Server, которая создает эту проблему.

Изображение версии RTM для расчета - снимок экрана показывает, как вычисление выводит значение.

Второй снимок экрана - мой локальныйSQL Server 2014 - так почему в версии RTM есть эта проблема? Есть ли какие-либо параметры или решение для этого, чтобы вернуть правильное значение, как в SQL Server 2014?

Image 1

Image 2

1 Ответ

3 голосов
/ 07 ноября 2019

Десятичное значение 0,00750 - это значение 7,4999999999999997E-3 при приведении к плавающей точке (хотя SSMS покажет 0,0075). Используя SQLCMD, вы можете увидеть фактическое значение:

sqlcmd -Q"DECLARE @c float = 0.00750;SELECT @c as float,ROUND(@c, 3) AS rounded;"

Результаты:

float                    rounded
------------------------ ------------------------
   7.4999999999999997E-3    7.0000000000000001E-3

Если вы измените уровень совместимости базы данных на 120 (SQL 2016) базы данных (предварительно), Управляемый экземпляр базы данных SQL Azure или база данных SQL Azure):

ALTER DATABASE YourDatabase SET COMPATIBILITY_LEVEL = 120;

и повторите тот же запрос, тогда результат будет неправильно округлен, как ваш экземпляр SQL 2016:

float                    rounded
------------------------ ------------------------
   7.4999999999999997E-3    8.0000000000000002E-3

Помнитеэто число с плавающей точкой является приблизительным и не может точно представлять все десятичные значения. Таким образом, база данных SQL Azure - правильное поведение округления, но поведение можно контролировать с помощью уровня совместимости базы данных, чтобы при необходимости обеспечить обратную совместимость.

...