SQL Server精度数据(decimal和numeric)在算术运算时的自动转换规则

来源:互联网 发布:java计算器单选按钮 编辑:程序博客网 时间:2024/06/01 07:44
 

SELECT CAST (124131.28*1.57/100AS DECIMAL(18,4))

SELECT CAST(1948.86[b]11[/b]*100/1.57AS DECIMAL(18,4))

结果为:(无列名)1948.8611

               (无列名)124131.2803

假定运算数分别为@d1(精度为p1,小数位数为s1),@d2(精度为p2,小数位数为s2), 则SQL内部的转换规则如下(我们知道精度的最大值是38,当运算结果的精度大于38时,SQL将会截短小数部分,以保证整数部分不会被截断。):

 

1. @d1+@d2

 

运算结果的精度 = max(s1,s2)+max(p1-s1,p2-s2)+1 --注:当值大于38时,取38

运算结果的小数位数 

   当精度值不大于38时 = max(p1,p2) --也就是取小数位数较大者

   当精度值大于38时 = 38 - max(p1-s1,p2-s2)

 

  1. --示例一:  
  2. declare @d1 numeric(12,6),@d2 numeric(10,7)  
  3. select @d1=100,@d2=200  
  4. select 精度=SQL_VARIANT_PROPERTY(@d1+@d2,'Precision'),小数位数=SQL_VARIANT_PROPERTY(@d1+@d2,'Scale'),运算结果=@d1+@d2  
  5. /* 
  6. 精度             小数位数           运算结果 
  7. ---------------- ------------------ ----------------- 
  8. 14               7                  300.0000000 
  9. */  
  10. 计算过程如下:  
  11.     运算结果的精度 = max(s1, s2) + max(p1-s1, p2-s2) + 1 = max(6,7)+max(12-6,10-7)+1 = 7+6+1 = 14 < 38  
  12.     运算结果的小数位数 = max(s1,s2) = max(6,7) = 7  
 

 

  1. --示例二:  
  2. declare @d1 numeric(38,7),@d2 numeric(35,1)  
  3. select @d1=100,@d2=200  
  4. select 精度=SQL_VARIANT_PROPERTY(@d1+@d2,'Precision'),小数位数=SQL_VARIANT_PROPERTY(@d1+@d2,'Scale'),运算结果=@d1+@d2  
  5. /* 
  6. 精度             小数位数           运算结果 
  7. ---------------- ------------------ ----------------- 
  8. 38               4                  300.0000 
  9. */  
  10. 计算过程如下:  
  11.     运算结果的精度=max(s1, s2) + max(p1-s1, p2-s2) + 1 = max(7,1)+max(38-7,35-1)+1 = 7+34+1=42 > 38,则取38  
  12.     运算结果的小数位数=38 - max(p1-s1, p2-s2) = 38-max(38-7,35-1) = 4  
 

 

2. @d1-@d2 (与相加完全相同,略)

 

3. @d1*@d2

 

运算结果的精度 = p1 + p2 + 1  --注:当值大于38时,取38

运算结果的小数位数

      当精度值不大于38(或s1+s2<=6)时 = s1 + s2 --也就是取两者小数位数之和

      当精度值大于38时 = max(6, s1+s2-(p1+p2+1-38))

 

  1. --示例三:  
  2. declare @d1 numeric(12,6),@d2 numeric(10,7)  
  3. select @d1=100,@d2=200  
  4. select 精度=SQL_VARIANT_PROPERTY(@d1*@d2,'Precision'),小数位数=SQL_VARIANT_PROPERTY(@d1*@d2,'Scale'),运算结果=@d1*@d2  
  5. /* 
  6. 精度             小数位数           运算结果 
  7. ---------------- ------------------ ----------------- 
  8. 23               13                 20000.0000000000000 
  9. */  
  10. 计算过程如下:  
  11.     运算结果的精度 = p1 + p2 + 1 = 12+10+1  = 23 < 38  
  12.     运算结果的小数位数 = s1+s2 = 6+7 = 13  
 

 

  1. --示例四:  
  2. declare @d1 numeric(20,7),@d2 numeric(21,10)  
  3. select @d1=100,@d2=200  
  4. select 精度=SQL_VARIANT_PROPERTY(@d1*@d2,'Precision'),小数位数=SQL_VARIANT_PROPERTY(@d1*@d2,'Scale'),运算结果=@d1*@d2  
  5. /* 
  6. 精度             小数位数           运算结果 
  7. ---------------- ------------------ ----------------- 
  8. 38               13                 20000.0000000000000 
  9. */  
  10. 计算过程如下:  
  11.     运算结果的精度 = p1 + p2 + 1 = 20+21+1 = 42 > 38  
  12.     运算结果的小数位数 = max(6, s1+s2-(p1+p2+1-38)) = max(6, 7+10-(20+21+1-38)) = max(6,13) = 13  
 

 

4. @d1/@d2

运算结果的精度 = p1 - s1 + s2 + max(6, s1 + p2 + 1)  --注:当值大于38时,取38

运算结果的小数位数 

      当精度值不大于38时 = max(6, s1 + p2 + 1)

      当精度值大于38时 = max(6, s1+p2+1-(精度-38))

 

  1. --示例五:  
  2. declare @d1 numeric(12,6),@d2 numeric(10,7)  
  3. select @d1=100,@d2=200  
  4. select 精度=SQL_VARIANT_PROPERTY(@d1/@d2,'Precision'),小数位数=SQL_VARIANT_PROPERTY(@d1/@d2,'Scale'),运算结果=@d1/@d2  
  5. /* 
  6. 精度             小数位数           运算结果 
  7. ---------------- ------------------ ----------------- 
  8. 30               17                 0.50000000000000000 
  9. */  
  10. 计算过程如下:  
  11.     运算结果的精度 = p1 - s1 + s2 + max(6, s1 + p2 + 1) = 12-6+7+max(6,6+10+1) = 13+17  = 30 < 38  
  12.     运算结果的小数位数 = max(6, s1 + p2 + 1) = max(6,6+10+1) = max(6,17) = 17  
 

  1. --示例六:  
  2. declare @d1 numeric(22,6),@d2 numeric(20,7)  
  3. select @d1=100,@d2=200  
  4. select 精度=SQL_VARIANT_PROPERTY(@d1/@d2,'Precision'),小数位数=SQL_VARIANT_PROPERTY(@d1/@d2,'Scale'),运算结果=@d1/@d2  
  5. /* 
  6. 精度             小数位数           运算结果 
  7. ---------------- ------------------ ----------------- 
  8. 38               15                 0.500000000000000 
  9. */  
  10. 计算过程如下:  
  11.     运算结果的精度 = p1 - s1 + s2 + max(6, s1 + p2 + 1) = 22-6+7+max(6,6+20+1) = 23+27  = 50 > 38 取38  
  12.     运算结果的小数位数 = max(6, s1+p2+1-(精度-38)) = max(6,6+20+1-(50-38)) = max(6,15) = 15  
 

 

5. SUM(@d1)

运算结果的精度 = 38 --也就是取最大精度

运算结果的小数位数:s1 --也就是小数位数保持不变

 

  1. declare @d1 numeric(12,6)  
  2. set @d1 = 100  
  3. select 精度=SQL_VARIANT_PROPERTY(sum(@d1),'Precision'),小数位数=SQL_VARIANT_PROPERTY(sum(@d1),'Scale'),运算结果=sum(@d1)  
  4. /* 
  5. 精度             小数位数           运算结果 
  6. ---------------- ------------------ ----------------- 
  7. 38               6                  100.000000 
  8. */  
 

 

6. AVG(@d1)

计算结果 = SUM(@d1) / NUMERIC(10,0)

示例:略

原创粉丝点击