我的DECIMAL(19,8)类型的值为A
- 比例为8
,因此将存储在小数点右侧的小数位数为{{1} }。
现在,我正在8
上A
,其中B
是B
。例如:
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
,29
,30
。
有人能说出为什么这三个部门的价值长度不是29
吗? 30
如何计算最终结果的比例?
答案 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),您会看到:
这意味着decimal的优先级高于bigint,bigint值将转换为decimal。
最后,你的计算将是:
如果您希望它为3 / 27
,则必须对Decimal值进行显式强制转换。