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

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



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

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

 

6. AVG(@d1)

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

示例:略