27,579
社区成员
发帖
与我相关
我的任务
分享
--假定运算数分别为@d1(精度为p1,小数位数为s1),@d2(精度为p2,小数位数为s2),
--则SQL内部的转换规则如下(我们知道精度的最大值是38,当运算结果的精度大于38时,
--SQL将会截短小数部分,以保证整数部分不会被截断。):
--money的精度是19,小数位数是4
-- @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
*/
--@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
*/