当我在sql server 2014中运行以下查询时,输出数据类型似乎与输入数据类型不同
DECLARE @i DECIMAL(18,2) = 2 ,@j DECIMAL(18,2) = 8
SELECT (@i/@j)
预期输出为:0.25
但我得到的是:0.25000000000000000000
我可以知道为什么这个DECIMAL(18,2)被改变了吗?
答案 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))