我有以下查询:
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)
答案 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,在这种情况下(如文档中所述)
必须通过(87-38 =) 49 来缩小,(51-49 =) 2 < / strong> ...*结果精度和比例的绝对最大值为38.当结果精度大于38时,相应的比例为 减少以防止结果的整体部分被截断。
我认为最小刻度长度 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中指出了同样的问题)。