在sql中的这个评估似乎由于某种原因不能正常工作,但我无法弄清楚原因。
让我们先拿这个例子。
DECLARE @countRatio decimal(6,3)
SET @countRatio = (((4)/(2))*(6))/100.0
_______________________________________
0,120
此评估就像一个魅力。我的计算器也得到了相同的答案。
但是这个例子给了我一个意想不到的答案。
DECLARE @countRatio decimal(6,3)
SET @countRatio = (((2)/(4))*(6))/100.0
_______________________________________
0,000
当我在计算器上计算时,答案是0,03 根据我的说法是正确的。但是sql一直给我0,000作为答案。有什么想法吗?
答案 0 :(得分:3)
问题是((2)/(4))
向下舍入为INT
,因为2和4都是INTs
。如果你使用2.0或4.0,你会得到正确的结果:
DECLARE @countRatio decimal(6,3)
SET @countRatio = (((2.0)/(4))*(6))/100.0
SELECT @countRatio
==========================
0.030
在任何算术表达式中,SQL Server转换为具有更高精度的运算符的类型。因此,2.0/4
会将结果转换为2.0
的类型,即float
。
答案 1 :(得分:2)
2
和4
是整数,因此SQL使用整数除法,得到0
。这将有效:
DECLARE @countRatio decimal(6,3)
SET @countRatio = (((2.0)/(4.0))*(6))/100.0
答案 2 :(得分:0)
declare @countRatio decimal(6,3)
-- Using integers 2 / 4 = 0:
set @countRatio = ( ( 2 / 4 ) * 6 ) / 100.0
select @countRatio
-- Using decimal values 2 / 4 = 0.5:
set @countRatio = ( ( 2. / 4. ) * 6. ) / 100.0
select @countRatio
-- Explicitly converting a value to decimal will cause the other values to be promoted to decimal:
set @countRatio = ( ( Cast( 2 as Decimal ) / 4 ) * 6 ) / 100.0 -- Decimals.
select @countRatio
-- Or:
set @countRatio = ( ( Convert( Decimal, 2 ) / 4 ) * 6 ) / 100.0 -- Decimals.
select @countRatio
-- The promotion occurs when it is needed. Hence this doesn't do what you want:
set @countRatio = ( ( 2 / 4 ) * Convert( Decimal, 6 ) ) / 100.0 -- Decimals.
select @countRatio