2011-11-25 57 views
4

我有以下代码:精度,小数位数总和,除以..截断

SELECT -701385.10 -- -701385.10 
SELECT SUM(-701385.10) -- -701385.10 
SELECT -701385.10/2889991754.89 -- -0.000242694498630 
SELECT SUM(-701385.10)/2889991754.89 -- -0.000242 

在过去SELECT结果被截断为6位小数。我已阅读了Precision, Scale, and Length文章,除非我的工作是错误的,否则我无法理解截断发生的原因。类型的表达SUM(-701385.10)的应DECIMAL(38,2) - 见SUM - 所以从分割所得的类型应具有:

精度:

  • P1 - S1 + S2 + MAX(6中,S1 + P2 + 1 )
  • 38 - 2 + 2 +最大(6,2 + 10 + 1)
  • 38 - 最大(6,13-​​)
  • 38 - 13

规模:

  • MAX(6中,S1 + P2 + 1)
  • MAX(6,2 + 10 + 1)
  • 最大值(6,13)

那么为什么小数位被截断?

+0

[T-SQL十进制分割精度](可能重复的HTTP ://stackoverflow.com/questions/423925/t-sql-decimal-division-accuracy) – gbn

回答

4

你的工作是错误的

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

给人

Precision: 38 - 2 + 2 + max(6, 2 + 12 + 1) = 53 
Scale: max(6, 2 + 12 + 1)     = 15 

是大于38,所以你越来越截断as covered here

+0

而这里http://stackoverflow.com/q/423925/27535 – gbn