SQL Server中的类型和轮次

时间:2014-11-04 17:24:28

标签: sql-server types sql-server-2012

我有以下查询:

DECLARE @A as numeric(36,14) = 480
DECLARE @B as numeric(36,14) = 1

select @B/@A
select cast(@B as decimal)/cast(@A as decimal)

为什么第一个计算返回0.002083而第二个计算返回0.00208333333333333

numeric(36,14)是否足够好以获得良好的精度(就像第二个查询一样)?

如果我只使用numeric,而不是numeric(36,14),我的精确度再次提高:

select cast(@B as numeric)/cast(@A as numeric)

2 个答案:

答案 0 :(得分:2)

您可以使用SQL Server Books online中的this文档自行计算精确度和比例。

我尝试计算你的案例(operation=division, p=36, s=14)的精确度和比例,我得到了一个非常奇怪的结果......

precision of the result: [p1 - s1 + s2 + max(6, s1 + p2 + 1)] -> 36-14+14+max(6,14+36+1)=36+51=87
scale of the result    : [max(6, s1 + p2 + 1)]                -> max(6,14+36+1)=51

在这种情况下,精度大于38,在这种情况下(如文档中所述)

  

*结果精度和比例的绝对最大值为38.当结果精度大于38时,相应的比例为   减少以防止结果的整体部分被截断。

必须通过(87-38 =) 49 来缩小(51-49 =) 2 < / strong> ...

我认为最小刻度长度 6 (因为表达式 scale = [max(6,s1 + p2 + 1)] )并且不能减少低于 6 - 我们得到的结果(0.002083)。

答案 1 :(得分:0)

只是为了解问题做出贡献(在@Andrey回答中更深入),根据计算的顺序,事情可能会很棘手。

考虑变量:^

DECLARE @A as NUMERIC(36,19) = 100
DECLARE @B as NUMERIC(36,19) = 480
DECLARE @C as NUMERIC(36,19) = 100

计算A / B * C

如果你想使用公式计算A / B * C,我们有:

A / B类型为NUMERIC(38,6) - &gt;由@Andrey计算

结果为0.208333(缩放为6) 乘以100,我们将获得20.833300

计算A * C / B

A * C的结果是10000类型的NUMERIC(38,6)。通过C潜水,结果将是20.833333

类型的NUMERIC(38,6)

然后,结果可能会有所不同,具体取决于计算顺序(https://dba.stackexchange.com/questions/77664/how-does-sql-server-determine-precision-scale中指出了同样的问题)。