Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server中的类型和循环_Sql Server_Types_Sql Server 2012 - Fatal编程技术网

Sql server SQL Server中的类型和循环

Sql server SQL Server中的类型和循环,sql-server,types,sql-server-2012,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.0020833333333 numeric(36,14)是否足够精确(就像第二个查询一样) 如果我只使用数值,而不是数值(36,14),那么我的精度还是很高的: sel

我有以下疑问:

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.0020833333333

numeric(36,14)
是否足够精确(就像第二个查询一样)

如果我只使用
数值
,而不是
数值(36,14)
,那么我的精度还是很高的:

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

您可以使用
SQL Server联机丛书
中的文档自行计算精度和比例

我试着为你的案例计算精度和比例
(运算=除法,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


我认为最小标度长度是6(因为表达式scale=[max(6,s1+p2+1)],并且它不能小于6——结果是(
0.002083
)。

仅仅有助于理解问题(深入@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是由@Andrey计算的
数字(38,6)
-->类型

结果将为
0.208333
(比例为
6
) 乘以
100
,我们将得到
20.833300

计算A*C/B

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


然后,结果可能会因计算顺序的不同而有所不同(中也指出了相同的问题)。

。也不要在没有特定精度/刻度的情况下将其转换为
数值
十进制
。@Nizam一点也不!事实上,这只不过是一个假设,但我认为真相就在那里:)这个问题我甚至不想解决这个问题,我只是想从一开始就理解它。你给了我一个很好的提示从哪里开始。老实说,我不知道我是否会更深入地讨论这个问题,因为它非常复杂,也没有多少好处。也许使用float类型可以解决我所有的查询。如果你简单地将类型从
numeric(36,14)
更改为
numeric(19,9)
,你的计算就会得到一个完美的刻度