【问题标题】:SQL Server Decimal precisionSQL Server 小数精度
【发布时间】:2014-09-24 17:54:52
【问题描述】:
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) 告诉我第二个查询应该更精确。

【问题讨论】:

  • 可能是从点的右侧到点的左侧减去小数点(10,5),例如 10 - 5 @ciucas
  • 如果您在除法之前选择变量...您可以看到后者确实具有更大的比例/精度(尽管没有完全填充),它是截断结果的除法运算。
  • 恰恰相反,@mohan111。 Decimal(p,s) 定义为精度和比例,其中精度是存储的最大总位数,比例是可以表示的小数点右侧的最大位数,最大为 p。
  • @CiucaS,如果您将精度设置为 38 会发生什么?您已经 34 岁了,所以您已经使用 17 个字节来存储它。 38 不使用任何额外的,每个 msdn.microsoft.com/en-us/library/ms187746.aspx
  • 是的,我同意你的看法@dodexahedron

标签: sql sql-server decimal


【解决方案1】:

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

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

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

考虑到 exp() 和 pi() 在这两种情况下的比例均为 16,使用小数点 (19,16) 可能会更好。

【讨论】:

【解决方案2】:

这里有很好的解释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)

【讨论】:

    【解决方案3】:

    在 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 时,缩小比例(简而言之……technet 的帖子还不错:))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多