我刚刚在"之间进行了实验。在TSQL中的语句,以下代码返回" true":
declare @Value as decimal
declare @Upper as decimal
declare @Lower as decimal
set @Value = 20.1
set @Lower = 10.0
set @Upper = 20.0
select
case
when @Value between @Lower and @Upper then 'true'
else 'false'
end as Result
如果我将@Value更改为20.5,结果为" false",但20.4返回" true"。似乎TSQL正在使用"银行家的四舍五入"小数值。
如果我将变量更改为" money",我会得到预期结果,即@Value = 20.1返回" false"。
答案 0 :(得分:5)
只是为了澄清发生了什么,如果你只是打印你的变量,你会发现它们的值分别为20,10和20。
decimal
的默认精度和比例分别为18和0,因此decimal
= decimal(18,0)
。这就是你在那里丢失小数的原因。
money
没有这个问题,因为它的精度为4位小数。
来源:https://msdn.microsoft.com/en-us/library/ms187746.aspx
SQL没有使用银行家的舍入。 .5总是向上舍入:20.5 -> 21
,21.5 -> 22
。随着银行家的四舍五入,20.5将四舍五入为20。
答案 1 :(得分:4)
我弄清楚我做错了什么。我忘了指定十进制变量中的小数点数。例如,以下代码返回" false"应该:
declare @Value as decimal(18,2)
declare @Upper as decimal(18,2)
declare @Lower as decimal(18,2)
set @Value = 20.1
set @Lower = 10
set @Upper = 20
select
case
when @Value between @Lower and @Upper then 'true'
else 'false'
end as Result
基本上,我的原始查询是使用整数而不是浮点值。