SQL Server,除法返回零

时间:2009-11-03 10:12:11

标签: sql

以下是我在示例中使用的代码:

 PRINT @set1
 PRINT @set2

 SET @weight= @set1 / @set2;
 PRINT @weight

结果如下:

47
638
0

我想知道为什么它会返回0而不是0,073667712

6 个答案:

答案 0 :(得分:130)

将set1和set2声明为浮点数而不是整数,或者将它们作为计算的一部分投射到浮点数中:

SET @weight= CAST(@set1 AS float) / CAST(@set2 AS float);

答案 1 :(得分:18)

如果在分区中仅使用整数,则会得到整数除法。当您使用(至少一个)double或float时,您将获得浮点除法(以及您想要获得的答案)。

所以你可以

  1. 将一个或两个变量声明为float / double
  2. 将一个或两个变量强制转换为float / double。
  3. 不要只将整数除法的结果转换为double:除法已经作为整数除法执行,因此小数后面的数字已经丢失。

答案 2 :(得分:11)

因为它是一个整数。您需要将它们声明为浮点数或小数,或者在计算中转换为等值。

答案 3 :(得分:9)

只需将除法的底部乘以1.0(或任意多个小数位)

PRINT @set1 
PRINT @set2 
SET @weight= @set1 / @set2 *1.00000; 
PRINT @weight

答案 4 :(得分:2)

如果您将其声明为float或任何十进制格式,则会显示

  

0

例如:

declare @weight float;

SET @weight= 47 / 638; PRINT @weight

输出:0

如果您希望输出为

  

0.073667712

E.g

declare @weight float;

SET @weight= 47.000000000 / 638.000000000; PRINT @weight

答案 5 :(得分:1)

在SQL Server中,两个整数的直接除法返回整数,即使结果应该是float。下面有一个例子可以解决这个问题:

--1--
declare @weird_number_float float
set @weird_number_float=22/7
select @weird_number_float

--2--
declare @weird_number_decimal decimal(18,10)
set @weird_number_decimal=22/7 
select @weird_number_decimal

--3--
declare @weird_number_numeric numeric
set @weird_number_numeric=22/7 
select @weird_number_numeric

--Right way

declare @weird_number float
set @weird_number=cast(22 as float)/cast(7 as float)
select @weird_number

最后一个区块将返回3,14285714285714。尽管以正确的精度定义了第二个块,但结果将是3.00000。