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)
告诉我第二个查询应该更精确。
答案 0 :(得分:4)
此链接有助于:http://msdn.microsoft.com/en-us/library/ms190476.aspx
根据这个,分区e1 / e2的结果的比例将由下式给出 这个公式max(6,s1 + p2 + 1),它还包括这个注释:考虑到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时,比例缩小(简而言之......技术网帖子非常好:))