除法(Transact-SQL)和数据类型优先级,数据类型分母为十进制(38,10)



根据文档/(Division) (Transact-SQL),结果类型与数据类型优先级相关,也就是说,在下面的场景中,是否有任何方法可以将结果类型接收为十进制(38,10)?

计算结果似乎失去了精度…精确的结果应该是0.8123567224

declare @a decimal(38,10) = 0.8123567216;
declare @b decimal(38,10) = 0.9999999990;
select 
[a] = @a
,[b] = @b
, result1 = @a / @b
, result2 = @a / CONVERT(decimal(38, 10), @b)
, result3 = CONVERT(decimal(38, 10), @a) / CONVERT(decimal(38, 10), @b)
, result4 = CONVERT(decimal(38, 10), (CONVERT(decimal(38, 10), @a) / CONVERT(decimal(38, 10), @b)))

小数除法的结果精度和比例规则在本文档页面的表格中注明。这是相关的表项:

e1/e2 p1 - s1 + s2 + max(6, s1 + p2 + 1) max(6, s1 + p2 + 1)

文件节选:

在乘法和除法运算中,我们需要精确标度存储结果的整部分的位置。尺度可能是使用以下规则减少:

结果比例尺减小到最小(比例尺,38 -(精度比例尺))如果积分部分小于32,因为它不可能大于38 -(精密刻度)。在这种情况下,结果可能会四舍五入。的如果小于6且积分部分为大于32。在这种情况下,如果它,可能会引发溢出错误不能放入十进制(38,比例),比例将设置为6,如果是大于6,如果积分部分大于32。在这个在这种情况下,无论是积分部分还是规模都会缩小,从而形成类型38岁的小数(6)。结果可能四舍五入到小数点后6位或如果整数部分不能装入32,将抛出溢出错误位数。

这可以通过sys.dm_exec_describe_first_result_set:

观察到。
SELECT name, system_type_name
FROM sys.dm_exec_describe_first_result_set (N'
declare @a decimal(38,10) = 0.8123567216;
declare @b decimal(38,10) = 0.9999999990;
select 
[a] = @a
,[b] = @b
, result1 = @a / @b
, result2 = @a / CONVERT(decimal(38, 10), @b)
, result3 = CONVERT(decimal(38, 10), @a) / CONVERT(decimal(38, 10), @b)
, result4 = CONVERT(decimal(38, 10), (CONVERT(decimal(38, 10), @a) / CONVERT(decimal(38, 10), @b)))
',NULL,NULL);
system_type_name小数(38岁,10)result1小数(38岁,6)result2小数(38岁,6)result3小数(38岁,6)result4小数(38岁,10)

相关内容

最新更新