SQL Server十进制精度

Ciu*_*caS 5 sql sql-server decimal

declare @nr1 decimal(20,19),
        @nr2 decimal(20,19)
set @nr1 = EXP(1.0)
set @nr2 = PI();
print @nr1/@nr2
Run Code Online (Sandbox Code Playgroud)

由于EXP和PI是"无限"数字,因此您应该始终有足够的小数来打印

此查询的结果是 0.865255979432265082

对于查询:

declare @nr12 decimal(34,25),
        @nr22 decimal(34,25)
set @nr12 = EXP(1.0)
set @nr22 = PI();
print @nr12/@nr22
Run Code Online (Sandbox Code Playgroud)

我得到了结果: 0.865255

所以我的问题是,为什么第一个查询比第二个查询更精确?正如decimal(p,s)在msdn中定义的那样,告诉我第二个查询应该更精确.

Jay*_*vee 4

此链接将有所帮助:http://msdn.microsoft.com/en-us/library/ms190476.aspx

据此,除法 e1/e2 的结果的范围将由以下公式 max(6, s1 + p2 + 1) 给出,并且还包括以下注释:

  • 结果精度和小数位数的绝对最大值为38。当结果精度大于38时,相应的小数位数会减小,以防止结果的整数部分被截断。

考虑到 exp() 和 pi() 的小数位数在这两种情况下都是 16,您可能会更好地使用decimal(19,16)。