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. 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. 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)
示例:略