SQL Math评估问题

时间:2012-03-30 17:40:49

标签: sql sql-server math

在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作为答案。有什么想法吗?

3 个答案:

答案 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)

24是整数,因此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