SQL Server十进制精度

时间:2014-08-01 13:48:01

标签: sql sql-server decimal

declare @nr1 decimal(20,19),
        @nr2 decimal(20,19)
set @nr1 = EXP(1.0)
set @nr2 = PI();
print @nr1/@nr2

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

此查询的结果为0.865255979432265082

对于查询:

declare @nr12 decimal(34,25),
        @nr22 decimal(34,25)
set @nr12 = EXP(1.0)
set @nr22 = PI();
print @nr12/@nr22

我得到了结果:0.865255

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

3 个答案:

答案 0 :(得分:4)

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

根据这个,分区e1 / e2的结果的比例将由下式给出 这个公式max(6,s1 + p2 + 1),它还包括这个注释:

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

考虑到exp()和pi()的比例在两种情况下均为16,你可能会更好地使用十进制(19,16)。

答案 1 :(得分:1)

这里有一个很好的解释T-SQL Decimal Division Accuracy

--Precision = p1 - s1 + s2 + max(6, s1 + p2 + 1)
--Scale = max(6, s1 + p2 + 1)

--Scale = 15 + 38 + 1 = 54
--Precision = 30 - 15 + 9 + 54 = 72
--Max P = 38, P & S are linked, so (72,54) -> (38,20)
--So, we have 38,20 output (but we don use 20 d.p. for this sum) = 11.74438969709659
SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,9),12499999.9999)


--Scale = 15 + 38 + 1 = 54
--Precision = 30 - 15 + 15 + 54 = 84
--Max P = 38, P & S are linked, so (84,54) -> (38,8)
--So, we have 38,8 output = 11.74438969
SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,15),12499999.9999)

答案 2 :(得分:1)

在technet上,您可以看到精确度如何在此处转移或截断:http://msdn.microsoft.com/en-us/library/ms190476(v=sql.105).aspx

总结(从technet转述): 当你有两个十进制数e1& e2,标度为s1& s2和精度p1& p2,除以e1 / e2得到你:

结果精度:p1 - s1 + s2 + max(6,s1 + p2 + 1) 结果比例:max(6,s1 + p2 + 1)

所以你的第二个块有p1 = p2 = 34和s1 = s2 = 25.上面的公式将产生

的结果精度
 34-25+25+max(6, 34+25+1)
=34+max(6,60)
=94

当结果精度大于38时,比例缩小(简而言之......技术网帖子非常好:))