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是链接的,所以:

  1. (72,54)→(38,29)

  2. (84,54)→(38,8)

假设(38,29)是一个错字,应该是(38,20) ,以下是math:

  1. 一世。 72 – 38 = 34,ii。 54 – 34 = 20

  2. 一世。 84 – 58 = 46,ii。 54 – 46 = 8

这就是推理:

一世。 输出精度最小的最大精度是我们要扔掉的数字。

II。 然后输出规模减去我们要扔掉的东西给我们…输出规模的剩余数字。

希望这可以帮助其他人试图理解这一点。

转换expression式不是参数。

 select CONVERT(DECIMAL(38,36),146804871.212533 / 12499999.9999) 

这可能有助于:

 SELECT COL1 * 1.0 / COL2