1

У меня есть поле, где я использую LEN() для вычисления длины строки, а затем я сравниваю это с значением, генерируемым AVG(CONVERT(FLOAT,LEN(some_field))).Сравнение Float с Int в SSRS

Точка сравнения сделать ЭТО, если первое значение меньше, чем второй и ЧТО, когда значение больше.

Мой вопрос заключается в следующем: при сравнении двух значений типов данных выше, в какой десятичной запятой система перестает использовать дальнейшие десятичные разряды для значения с плавающей запятой, а затем решает ее округлить?

В качестве примера, сравнение 10 по сравнению с 9.5. Таким образом, он выберет один из вариантов (неважно, какой). Но как насчет 10 по сравнению с 9.99999999999999999? Будет ли система решить, что 9.99999999999999999 на самом деле 10, таким образом разрушая точку сравнения?

ответ

0

Для ответа на этот вопрос требуется две части.

При сравнении двух значений типов данных выше, в каком десятичном разряде система останавливает использование дальнейших знаков после запятой для значения с плавающей запятой, а затем решает ее округлить?

предела, при котором округление или усечение числа с плавающей запятой происходит основано на точности системы для этого типа данных. Для float оно составляет до 15 цифр.

Используя ваш код в качестве примера, если у вас было 11 строк с общей длиной 29, то возвращается AVG: 2.63636363636364 (неокончательный, повторяющийся номер), заканчивающийся на 15-й цифре.

Если вы должны были попытаться представить 9.99999999999999999 как поплавок, было бы округлить до 10.

Я использую LEN(), чтобы вычислить длину строки, а затем я сравниваю это значение созданный AVG (CONVERT (FLOAT, LEN (some_field))).

Но тогда что относительно 10 по сравнению с 9.99999999999999999? Будет ли система решать, что 9,99999999999999999 на самом деле 10, таким образом разрушая точку сравнения?

Прежде всего, иметь в виду, что AVG() тип возвращаемого значения зависит от типа данных параметра (в разделе «Типы возвращаемых данных» в разделе https://msdn.microsoft.com/en-GB/library/ms177677.aspx), и потому, что вы явно преобразования LEN(some_field) значение поплавка, ваш AVG() результат будет всегда будет значением поплавка. Если вам нужна большая точность и масштаб, например 9.99999999999999999, рассмотрите возможность преобразования этого параметра в decimal.

Во-вторых, потому, что LEN() возвращает значение типа int и AVG() возвращает значение, которое не может быть int, как упоминалось выше, ваше сравнение в период между значениями двух различных типов данных и Data Type Precedence входит в игру.

Смежные вопросы