Вывод функции приведения - PullRequest
0 голосов
/ 21 января 2020

Я работаю над использованием функции Cast на SQL Сервере. Если я использую явное значение, как написано в коде. Выходное значение 38, которое является правильным значением. Но мне нужно было бы использовать имена полей вместо прямых значений (здесь есть только значение Base, эскалатор; Base = 1,15 и эскалатор = 0,05. Но когда я использую имена полей, вывод будет 37. Тип данных Base и эскалатор fields is float. Я также пытался использовать функцию округления внутри cast, не решил проблему. Может ли кто-нибудь здесь помочь мне с этим. Мой запрос ниже:

Select CAST((3.05-1.15)/0.05 AS INT) -- returns 38
Select ((3.05-1.15)/0.05) --returns 38
Select cast((3.05-base)/Escalator) as int) from table1 -- I am using field names here. Returns 37

Ответы [ 3 ]

1 голос
/ 21 января 2020

Вы можете использовать Decimal, чтобы избавиться от проблемы

DECLARE @Escalator DECIMAL(7, 5) = 0.05
Select ((3.05-1.15)/0.05) --returns 38
Select CAST(((3.05-1.15)/@Escalator) AS INT) -- returns 38

Демонстрация на db <> fiddle

1 голос
/ 21 января 2020

Вероятно, здесь происходит то, что столбцы base и Escalator являются неким типом с плавающей запятой. В результате в результате следующих вычислений получается значение, которое немного меньше 38:

(3.05-base) / Escalator = 37.999995 (for example)

Затем при приведении к целому числу весь десятичный компонент усекается, оставляя только 37.

Одним из возможных способов избежать этого является использование NUMERIC или другого точного типа для столбцов base и Escalator.

0 голосов
/ 21 января 2020

Вы можете использовать встроенную функцию потолка или пола в зависимости от ваших требований

DECLARE @Escalator float = 0.05
DECLARE @Base float = 1.66
Select ((3.05-1.66)/0.05) --returns 27.8
Select ceiling (((3.05-@Base)/@Escalator)) -- returns 28
Select floor (((3.05-@Base)/@Escalator)) -- returns 27
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...