T-SQL十进制除法精度
有谁知道为什么,使用SQLServer 2005
SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,9),12499999.9999)
给我11.74438969709659,
但是当我把分母的小数位数增加到15时,我得到的答案不太准确:
SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,15),12499999.9999)
给我11.74438969
对于乘法,我们只需将每个参数中的小数位数加起来(使用笔和纸)来计算输出的十位数。
但分裂只是把你的头脑分开。 我现在要躺下来了
用SQL术语来说,它和预期完全一样。
--Precision = p1 - s1 + s2 + max(6, s1 + p2 + 1) --Scale = max(6, s1 + p2 + 1) --Scale = 15 + 38 + 1 = 54 --Precision = 30 - 15 + 9 + 54 = 72 --Max P = 38, P & S are linked, so (72,54) -> (38,20) --So, we have 38,20 output (but we don use 20 dp for this sum) = 11.74438969709659 SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,9),12499999.9999) --Scale = 15 + 38 + 1 = 54 --Precision = 30 - 15 + 15 + 54 = 84 --Max P = 38, P & S are linked, so (84,54) -> (38,8) --So, we have 38,8 output = 11.74438969 SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,15),12499999.9999)
如果你把每个数字对作为,你也可以按照这个规则来做同样的math运算
- 146804871.212533000000000和12499999.999900000
- 146804871.212533000000000和12499999.999900000000000
简而言之,使用DECIMAL(25,13),所有的计算结果都可以正常工作 – 您将得到如下声明的精确度:小数点之前12位数,小数点后13位。 规则是:p + s必须等于38,你会安全的一面! 为什么是这样? 由于SQL Server中的算术实现非常糟糕! 直到他们解决它,遵循这个规则。
我注意到,如果你把分割值浮动,它会给你正确的答案,即:
select 49/30 (result = 1)
会成为:
select 49/cast(30 as float) (result = 1.63333333333333)
我们对魔术过渡感到困惑,
P&S是链接的,所以:
(72,54)→(38,29)
(84,54)→(38,8)
假设(38,29)
是一个错字,应该是(38,20)
,以下是math:
-
一世。 72 – 38 = 34,ii。 54 – 34 = 20
-
一世。 84 – 58 = 46,ii。 54 – 46 = 8
这就是推理:
一世。 输出精度最小的最大精度是我们要扔掉的数字。
II。 然后输出规模减去我们要扔掉的东西给我们…输出规模的剩余数字。
希望这可以帮助其他人试图理解这一点。
转换expression式不是参数。
select CONVERT(DECIMAL(38,36),146804871.212533 / 12499999.9999)
这可能有助于:
SELECT COL1 * 1.0 / COL2