分区SQL Server中的数据类型更改

时间:2016-09-15 09:33:13

标签: sql sql-server

当我在sql server 2014中运行以下查询时,输出数据类型似乎与输入数据类型不同

DECLARE @i DECIMAL(18,2) = 2 ,@j DECIMAL(18,2) = 8

SELECT (@i/@j)

预期输出为:0.25
但我得到的是:0.25000000000000000000

我可以知道为什么这个DECIMAL(18,2)被改变了吗?

5 个答案:

答案 0 :(得分:1)

尝试使用以下查询。

DECLARE @i DECIMAL(18,2) = 2 ,@j DECIMAL(18,2) = 8

SELECT CAST((@i/@j) as decimal(18,2))

答案 1 :(得分:1)

对于SQL-Server 2012+您可以使用FORMAT()

SELECT FORMAT((@i/@j), 'N2')

正如@Damien_the_Unbeliever所说,你应该注意到这会将输出作为字符串返回..

对于较低版本,请尝试以下操作:

SELECT cast((@i/@j) as  decimal(18,2))

答案 2 :(得分:1)

你可以试试这个

SELECT convert(decimal(18,2),(@i/@j))

答案 3 :(得分:0)

试试这个:

DECLARE @i DECIMAL(18,2) = 2 ,@j DECIMAL(18,2) = 8
SELECT (@i/CAST(@j AS FLOAT))

OR

DECLARE @i DECIMAL(18,2) = 2 ,@j DECIMAL(18,2) = 8
SELECT CAST((@i/@j) AS FLOAT)

答案 4 :(得分:0)

请参阅https://msdn.microsoft.com/en-IN/library/ms190476.aspx

关于正常分区操作的比例和精度如下

操作:e1 / e2

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

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

哪里

p1是e1的精度

s1是e1的比例

p2是e1的精度

s2是e1的比例

在您的情况下,p1 = p2 = 18且s1 = s2 = 2

按照上述计算

输出精度(Pr)和outpur(Sr)的比例如下

Pr = p1 - s1 + s2 + max(6, s1 + p2 + 1)

Pr = 18 - 2 + 2 + max(6, 2 + 18 + 1)

Pr = 18 - 2 + 2 + 21

Pr = 39

因此,结果中必须有最多39位数字。但

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

因此会有38位数字。

作为十进制值小于1但大于0的除法结果,它将在小数点前只给出一个0

现在让我们计算Scale(Sr)

Sr = max(6, s1 + p2 + 1)

Sr = max(6, 2 + 18 + 1)

Sr = 21

小数点后必须有21位数。 但是,根据最大精度值,比例中的最后一位数将被截断。这就是为什么你的结果只有小数点后的20位数。

因此结果 0.25000000000000000000

如果你想使用CAST或转换得到0.25分,那么

DECLARE @i DECIMAL(18,3) = 2 ,@j DECIMAL(18,3) = 8

SELECT CAST((@i/@j) AS Decimal(18,2))
相关问题