十进制和bigint分割时如何定义比例?

时间:2015-10-29 14:30:14

标签: sql-server tsql sql-server-2012 decimal division

我的DECIMAL(19,8)类型的值为A - 比例为8,因此将存储在小数点右侧的小数位数为{{1} }。

现在,我正在8A,其中BB。例如:

BIGINT

输出值的长度分别为:SELECT CAST(3 AS DECIMAL(19, 8)) / CAST(27 AS BIGINT) -- 0.111111111111111111111111111 ,CAST(300 AS DECIMAL(19, 8)) / CAST(27 AS BIGINT) -- 11.111111111111111111111111111 ,CAST(75003 AS DECIMAL(19, 8)) / CAST(13664400 AS BIGINT) -- 0.005488934750153684025643277 2930

有人能说出为什么这三个部门的价值长度不是29吗? 30如何计算最终结果的比例?

2 个答案:

答案 0 :(得分:4)

参数1:3 AS DECIMAL(19, 8)

参数2:27 AS DECIMAL (18, 0) - 默认精度为18,默认比例为0(由于类型优先,BIGINT已转换为DECIMAL

p1 = 19
p2 = 18
s1 = 8
s2 = 0
  

最大精度=(p1 - s1 + s2)+ MAX(6,s1 + p2 + 1) - 最多38

     

max scale = MAX(6,s1 + p2 + 1)

让我们计算例如1:

precision: (19 - 8 + 0) + MAX(6, 8 + 18 + 1) = 38
scale:     MAX(6, 8 + 18 + 1) = 27

对于您的所有示例,您将始终获得最大27分。

 0.111111111111111111111111111 (27)
11.111111111111111111111111111 (27)
 0.005488934750153684025643277 (27)

整个部分只需要数字(1),(2),(1)。

对我来说,一切都非常有效。

此答案基于 @Paul White Decimal Truncation In division 的工作。

答案 1 :(得分:0)

这是调用数据类型优先。

当查询在不同但兼容的类型之间执行某些操作时,必须将其中一个类型转换为另一个类型,即带有显式或隐式转换的eitheir。

如果你看Data Type Conversion (Database Engine) ,您将看到Decimal和Bigint之间存在隐式转换。

因此,您的查询不需要显式转换。

如果您在MSDN上查看Data Type Precedence (Transact-SQL),您会看到:

    1. 小数
    1. BIGINT

这意味着decimal的优先级高于bigint,bigint值将转换为decimal。

最后,你的计算将是:

  • 3,000 ... / 27,000 ......
  • 300,000 ... / 27,000 ......
  • 75003,000 ... / 27,000 ......

如果您希望它为3 / 27,则必须对Decimal值进行显式强制转换。