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)
- --示例一:
- declare @d1 numeric(12,6),@d2 numeric(10,7)
- select @d1=100,@d2=200
- select 精度=SQL_VARIANT_PROPERTY(@d1+@d2,'Precision'),小数位数=SQL_VARIANT_PROPERTY(@d1+@d2,'Scale'),运算结果=@d1+@d2
- /*
- 精度 小数位数 运算结果
- ---------------- ------------------ -----------------
- 14 7 300.0000000
- */
- 计算过程如下:
- 运算结果的精度 = max(s1, s2) + max(p1-s1, p2-s2) + 1 = max(6,7)+max(12-6,10-7)+1 = 7+6+1 = 14 < 38
- 运算结果的小数位数 = max(s1,s2) = max(6,7) = 7
- --示例二:
- declare @d1 numeric(38,7),@d2 numeric(35,1)
- select @d1=100,@d2=200
- select 精度=SQL_VARIANT_PROPERTY(@d1+@d2,'Precision'),小数位数=SQL_VARIANT_PROPERTY(@d1+@d2,'Scale'),运算结果=@d1+@d2
- /*
- 精度 小数位数 运算结果
- ---------------- ------------------ -----------------
- 38 4 300.0000
- */
- 计算过程如下:
- 运算结果的精度=max(s1, s2) + max(p1-s1, p2-s2) + 1 = max(7,1)+max(38-7,35-1)+1 = 7+34+1=42 > 38,则取38
- 运算结果的小数位数=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))
- --示例三:
- declare @d1 numeric(12,6),@d2 numeric(10,7)
- select @d1=100,@d2=200
- select 精度=SQL_VARIANT_PROPERTY(@d1*@d2,'Precision'),小数位数=SQL_VARIANT_PROPERTY(@d1*@d2,'Scale'),运算结果=@d1*@d2
- /*
- 精度 小数位数 运算结果
- ---------------- ------------------ -----------------
- 23 13 20000.0000000000000
- */
- 计算过程如下:
- 运算结果的精度 = p1 + p2 + 1 = 12+10+1 = 23 < 38
- 运算结果的小数位数 = s1+s2 = 6+7 = 13
- --示例四:
- declare @d1 numeric(20,7),@d2 numeric(21,10)
- select @d1=100,@d2=200
- select 精度=SQL_VARIANT_PROPERTY(@d1*@d2,'Precision'),小数位数=SQL_VARIANT_PROPERTY(@d1*@d2,'Scale'),运算结果=@d1*@d2
- /*
- 精度 小数位数 运算结果
- ---------------- ------------------ -----------------
- 38 13 20000.0000000000000
- */
- 计算过程如下:
- 运算结果的精度 = p1 + p2 + 1 = 20+21+1 = 42 > 38
- 运算结果的小数位数 = 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))
- --示例五:
- declare @d1 numeric(12,6),@d2 numeric(10,7)
- select @d1=100,@d2=200
- select 精度=SQL_VARIANT_PROPERTY(@d1/@d2,'Precision'),小数位数=SQL_VARIANT_PROPERTY(@d1/@d2,'Scale'),运算结果=@d1/@d2
- /*
- 精度 小数位数 运算结果
- ---------------- ------------------ -----------------
- 30 17 0.50000000000000000
- */
- 计算过程如下:
- 运算结果的精度 = p1 - s1 + s2 + max(6, s1 + p2 + 1) = 12-6+7+max(6,6+10+1) = 13+17 = 30 < 38
- 运算结果的小数位数 = max(6, s1 + p2 + 1) = max(6,6+10+1) = max(6,17) = 17
- --示例六:
- declare @d1 numeric(22,6),@d2 numeric(20,7)
- select @d1=100,@d2=200
- select 精度=SQL_VARIANT_PROPERTY(@d1/@d2,'Precision'),小数位数=SQL_VARIANT_PROPERTY(@d1/@d2,'Scale'),运算结果=@d1/@d2
- /*
- 精度 小数位数 运算结果
- ---------------- ------------------ -----------------
- 38 15 0.500000000000000
- */
- 计算过程如下:
- 运算结果的精度 = p1 - s1 + s2 + max(6, s1 + p2 + 1) = 22-6+7+max(6,6+20+1) = 23+27 = 50 > 38 取38
- 运算结果的小数位数 = max(6, s1+p2+1-(精度-38)) = max(6,6+20+1-(50-38)) = max(6,15) = 15
5. SUM(@d1)
运算结果的精度 = 38 --也就是取最大精度
运算结果的小数位数:s1 --也就是小数位数保持不变
- 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)
示例:略
- SQL Server精度数据(decimal和numeric)在算术运算时的自动转换规则
- sql server中的decimal或者numeric的精度问题
- SQL Server decimal 和 numeric 区别
- SQL Server DECIMAL精度设置
- decimal 和 numeric 的区别
- NUMERIC和DECIMAL的区别
- sql字段类型之decimal 和 numeric
- SQL SERVER 中 Decimal 相乘,结果精度过高时的截断规律
- sql Server中float、real、decimal(numeric)数据类型的区别
- C语言中算术运算的隐式类型转换规则
- C++中算术运算的隐式转换规则
- 关于 js 算术运算时精度问题
- decimal(numeric )、float 和 real 数据类型的区别
- SqlServer中decimal(numeric )、float 和 real 数据类型的区别
- SqlServer中decimal(numeric )、float 和 real 数据类型的区别
- decimal(numeric )、float 和 real 数据类型的区别
- decimal(numeric )、float 和 real 数据类型的区别[转]
- SqlServer中decimal(numeric )、float 和 real 数据类型的区别
- oracle批量update
- J2EE笔记——Spring
- 魔术拆穿了,其实很简单
- 败者树 K-路归并排序
- android 开发备忘
- SQL Server精度数据(decimal和numeric)在算术运算时的自动转换规则
- 总结一下BusinessBase都含有哪些功能
- J2EE笔记——Hibernate
- 总结一下BusinessListBase都做了哪些功能 .
- 事件管理器想法.
- tip提示
- 深入研究java.lang.ThreadLocal类
- 配置还是代码 .
- 更新并复制到新表