将十进制除以十进制并得到零

时间:2014-01-16 17:52:28

标签: sql sql-server math decimal division

为什么我这样做:

select CAST(1 AS DECIMAL(38, 28))/CAST(1625625 AS DECIMAL(38, 28))

我得到0,但是当我做

select CAST(1 AS DECIMAL(20, 10))/CAST(1625625 AS DECIMAL(20, 10))

我得到了一个值?

我原本期望更高精度的除法能够返回更高精度的结果,为什么不是这样呢?

2 个答案:

答案 0 :(得分:3)

这是因为对于数学运算,使用http://msdn.microsoft.com/en-us/library/ms190476.aspx#division

中的规则计算得到的精度和比例
  

操作
   e1 / e2

     

结果精确度
   p1 - s1 + s2 + max(6,s1 + p2 + 1)

     

结果比例
   max(6,s1 + p2 + 1)

因此,对两个部分使用decimal(38/28)时,您会以decimal(105,67)结尾,但不受支持,因此会被截断。

同时引用

  

结果精度和标度的绝对最大值为38.当结果精度大于38时,相应的标度会减小,以防止结果的整数部分被截断。

答案 1 :(得分:1)

作为替代方案,您可以随时改为

SELECT CONVERT(DECIMAL(38,28), 1 / 1625625.0)

SELECT CONVERT(DECIMAL(10,10), 1 / 1625625.0)

SELECT CONVERT(DECIMAL(38,28), 1.0 / 1625625)

SELECT CONVERT(DECIMAL(10,10), 1.0 / 1625625)

所有4个查询都会导致相同的结果。如果你没有将.0放在两个部分中的一个上,它将被视为整数除法,只有结果将被转换为十进制。