为什么我的 SQL Server 十进制除法给我 6 位数?

Why does my SQL Server decimal division give me a scale of 6 digits?

提问人:Anupam datta 提问时间:6/24/2020 最后编辑:HeinziAnupam datta 更新时间:6/24/2020 访问量:410

问:

我是 SqlServer 的新手,正在使用 SQLServer2019。我已经学习了 CAST() 和 CONVERT() 内置函数。现在我很困惑为什么我的代码给出 6 的比例。

DECLARE @num1 AS int = 4;
DECLARE @num2 AS int = 127;
select @num2/Convert(decimal(5,2), @num1) as 'Div result';
select CONVERT(decimal(4,2), @num1);
select CAST(@num1 as decimal(4,2));

上述 SQL 查询的结果是:

31.750000

4.00

4.00

我正在尝试将除法结果缩放到小数点后 3 位,但它不起作用。

第 4 行和第 5 行按我的预期工作,但为什么第 3 行的行为是这样的?

先谢谢你。

SQL-Server 强制 类型转换 精度

评论

0赞 Damien_The_Unbeliever 6/24/2020
检查精度、小数位数和长度页面上的表格。除非您有大量的精度值,否则您不会得到少于 6 的值。
0赞 Heinzi 6/24/2020
@Damien_The_Unbeliever:我不敢苟同:因为公式是 ,你永远不会得到小于 6 的除法。max(6, ...)

答:

2赞 Heinzi 6/24/2020 #1

根据 SQL Server 文档,对于小数除法,结果值的小数位数为:

max(6, s1 + p2 + 1)

就你而言,那是.max(6, 0 + 5 + 1) = 6

源:精度、小数位数和长度 (Transact-SQL)Source: Precision, Scale, and Length (Transact-SQL)

评论

0赞 Anupam datta 6/24/2020
但是@Heinzi我使用了 scale = 2, precision=5,那么应该像 (max, 2+5+1) = 8。不是吗?或者我做错了什么。请纠正我。我很困惑。
0赞 Anupam datta 6/24/2020
谢谢@Heinzi的帮助和链接。我明白了解决方案
0赞 Heinzi 6/24/2020
@Anupamdatta:你把它倒过来了:s1 指的是第一个数字的刻度。由于除以 ,s1 是指 的刻度。 是一个整数,其小数位数为 0。@num2/...@num2@num2
0赞 Anupam datta 6/24/2020 #2

文档中,我理解了答案。

我没有提到 @num1 的精度,所以十进制的默认精度为零,因此 s1=0

精度 @num2 = 5,因此 p2=5

因此,最大值(6, S1+P2+1) => 最大值(6, 0+5+1) = 6

因此,它在答案中显示 6 分。