强制转换函数的输出

问题描述 投票:0回答:3

我正在研究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
sql sql-server tsql
3个回答
1
投票

[这里可能发生的是baseEscalator列是某种非精确浮点类型。结果,以下计算得出的值稍微小于38:

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

然后,当转换为整数时,整个小数部分将被截断,仅剩下37。

防止这种情况发生的一种可能的解决方法是对NUMERICbase列使用Escalator或其他准确类型。


1
投票

您可以使用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

Demo on db<>fiddle


0
投票

您可以根据需要使用天花板或地板内置功能

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
© www.soinside.com 2019 - 2024. All rights reserved.