我正在研究SQL Server中Cast
函数的用法。如果我使用代码中写的显式值。输出为38,这是正确的值。但是我将需要使用字段名称而不是直接值(此处仅存在Base,escalator的值; Base = 1.15和escalator = 0.05。但是当我使用字段名称时,输出为37。Base和escalator的数据类型字段是浮动的。我也尝试过在强制转换内部使用round函数,没有解决问题。有人可以在这里帮助我吗?我的查询如下:
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
[这里可能发生的是base
和Escalator
列是某种非精确浮点类型。结果,以下计算得出的值稍微小于38:
(3.05-base) / Escalator = 37.999995 (for example)
然后,当转换为整数时,整个小数部分将被截断,仅剩下37。
防止这种情况发生的一种可能的解决方法是对NUMERIC
和base
列使用Escalator
或其他准确类型。
您可以使用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
您可以根据需要使用天花板或地板内置功能
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