SQL Server,除法返回零


86

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

 PRINT @set1
 PRINT @set2

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

结果如下:

47
638
0

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


这是一个'int':DECLARE @weight INT
Roch

Answers:


152

将set1和set2声明为浮点数而不是整数,或者将它们强制转换为浮点数作为计算的一部分:

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

24

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

这样你就可以

  1. 声明一个或两个变量为float / double
  2. 将一个或两个变量强制转换为float / double。

不要只是将整数除法的结果转换为两倍:除法已经作为整数除法执行,因此小数点后的数字已经丢失。


4
+1,因为我认为您对此解释得更好,并提到只有其中一个值需要为浮点数/双
精度数-Chaulky

11

因为它是整数。您需要将它们声明为浮点数或小数,或在计算中强制转换为此类。


如果将@weight变量更改为float,就足够了吗?
罗奇


2

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

0

只要

例如:

declare @weight float;

SET @weight= 47 / 638; PRINT @weight

输出:0

如果您希望输出为

0.073667712

例如

declare @weight float;

SET @weight= 47.000000000 / 638.000000000; PRINT @weight

嗯,我现在知道了,但是我要除的两个数字是变量,如果未在变量中指定.0000,它似乎不起作用。
罗奇

因此,您需要将@ set1和@ set2都
强制转换

1

在SQL Server中,即使结果应为浮点数,两个整数的直接除法也会返回整数。下面有一个示例来说明这一点:

--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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.